一个 python + 数据预处理+随机森林模型 (案列)

简介: 本文介绍了一个使用Python进行数据预处理和构建随机森林模型的实际案例。首先,作者通过删除不必要的列和特征编码对数据进行了预处理,然后应用随机森林算法进行模型训练,通过GridSearchCV优化参数,最后展示了模型的评估结果。

一个 python + 数据预处理+随机森林模型 (案列)

本次使用的是 样本可以去 boci_trial_0423.csv 下载

下载boci_trial_0423.csv


前言


这个是之前写的一个 python 的 + 随机森林模型例子,不适合初学者。


根据 百度百科的定义


随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。


定义

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。 而 “Random Forests” 是他们的商标。 这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合 Breimans 的 “Bootstrap aggregating” 想法和 Ho 的"random subspace method"以建造决策树的集合。

随机森林是一种包含很多决策树的分类器,既可以用于处理分类和回归问题,也适用于降维问题。其对异常值与噪音也有很好的容忍,相较于决策树有着更好的预测和分类性能。 [3]


学习算法


根据下列算法而建造每棵树 [1]:

1.用N来表示训练用例(样本)的个数,M表示特征数目。

2.输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。

3.从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

4.对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。

5.每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。

准备

下载帮助文档

请先安装下面的库

pip install sklearn
pip install pandas
pip install joblib

一、python 代码

深度学习和强化学习都需要丰富的词汇来定义架构

import pandas as pd
import numpy as np
from sklearn import preprocessing

    ### 从Excel读
data_all=None
data_train=None
data_test=None
run_paint_or_ml=2


####################
# 1.2 数据预处理
####################
def run_preprocess(df,run_paint_or_ml):

    ###### 1) 舍弃不需要的列
    if run_paint_or_ml==1:
        ### 用于演示画图
        df=df.drop(['sysCustomerID'],axis=1)
        #df=df.drop(['sysCustomerID','sysContactID','ContactHrMi','Round','CampaignName','RemarkLength','Consider1','Consider9',],axis=1)
    else:
        ### 用于机器学习
        df=df.drop(['sysCustomerID','sysContactID','ContactDay','ContactHr','Team','Agent','ContactHrMi','Round','CampaignName','RemarkLength','Consider1','Consider9',],axis=1)

    ###### 2) 编码
    if run_paint_or_ml==1:
        ### 用于演示画图
        features = ['AgeGroup','Team','Agent',]
    else:
        ### 用于机器学习
        features = ['AgeGroup']

    for feature in features:
        le = preprocessing.LabelEncoder()
        le = le.fit(df[feature])
        df.is_copy =False
        df[feature] = le.transform(df[feature])

    print('\n==========> 预览预处理后的数据:==========')
    print(df.head())

    ###### 3) 分割数据集
    X=df.drop(['Result'],axis=1)
    y=df['Result']

    return df, X, y

# from sklearn.datasets import make_classification
from sklearn.metrics import make_scorer, accuracy_score, recall_score, precision_recall_fscore_support
from pprint import pprint

def scores(p,y):
    m = pd.DataFrame({'p':p,'y':y.values})
    tp = m[m.y+m.p>1].size/2
    pp = m[m.p>0].size/2
    ap = m[m.y>0].size/2
    print('true positive: {0}'.format(tp))
    print('predicted positive = true positive + false positive: {0}, tp/pp: {1}'.format(pp, tp/pp))
    print('actual positive = true positive + false negative: {0}, tp/ap: {1}'.format(ap, tp/ap))

    #print(m[m.y+m.p>0][0:m[m.y+m.p>0].size//2-1])
    '''
    i=0
    while i < m[m.y+m.p>0].size/2:
        print(m[m.y+m.p>0][i:min(i+50,int(m[m.y+m.p>0].size/2))])
        print('... ... ... ... ...')
        i+=50
    '''

####################
# 2.3 随机森林
####################
from sklearn.ensemble import RandomForestClassifier 
from sklearn.model_selection import GridSearchCV
import joblib
def run_RandomForest(X_train,y_train,X_test,y_test,threshold):
    print("-----------------随机森林----------------------------------")
    ###### 实例化模型
    clf=RandomForestClassifier()
    '''
    ###### 使用GridSearchCV调优参数
    ### 设置参数
    parameters={'n_estimators':[4,6,9],
                'criterion':['entropy','gini'],
                'max_features':['log2','sqrt','auto'],
                'max_depth':[2,3,5,10],
                'min_samples_leaf':[1,5,8],
                'min_samples_split':[2,3,5]
                }

    ### 测试参数
    acc_scorer=make_scorer(accuracy_score)
    gs=GridSearchCV(clf,parameters,scoring=acc_scorer,verbose=1)
    gs=gs.fit(X_train,y_train)

    ### 将最优参数赋给分类器
    print(gs.best_params_)
    clf=gs.best_estimator_
    '''
    ###### 直接使用调优得到的参数
    clf=RandomForestClassifier(criterion='entropy', max_depth=2, max_features='log2', min_samples_leaf=1, min_samples_split=2, n_estimators=4)

    ###### 加载模型
    #clf = joblib.load('rfc.pkl')

    ###### 训练数据
    clf.fit(X_train,y_train)

    ### 使用训练好的分类模型进行预测
    if threshold==1:
        predictions = clf.predict(X_test)
    else:
        # proba
        predictions = clf.predict_proba(X_test)[:,1]>threshold


    ###### 模型评估
    print('\n==========> 随机森林 --- precision:',accuracy_score(y_test, predictions))

  #这行代码使用了accuracy_score函数来计算随机森林模型的精确度。accuracy_score函数接受两个参数,
  #y_test表示测试集的真实标签,
  #predictions表示模型预测的标签。精确度是指模型预测为正例的样本中,真实为正例的比例。这行代码会输出随机森林模型的精确度。
  
    print('==========> 随机森林 --- recall:',recall_score(y_test, predictions))
  #这行代码使用了recall_score函数来计算随机森林模型的召回率。
  #recall_score函数也接受两个参数,
  #y_test表示测试集的真实标签,
  #predictions表示模型预测的标签。召回率是指真实为正例的样本中,模型预测为正例的比例。这行代码会输出随机森林模型的召回率**

  
    ### 打印出三个指标
    print(precision_recall_fscore_support(y_test, predictions,average='binary'))



    ###### 持久化
    ### 保存模型
    joblib.dump(clf, 'rfc.pkl')

    return predictions

def main():

    ### 从Excel读
    data_all=pd.read_csv('boci_trial_0423.csv')
    data_train=data_all.head(2000)
    data_test=data_all.tail(8000)
    #print('==========预览训练集:==========\n',data_all.head())

    ###### 1.2 数据预处理
    data_train, X_train, y_train = run_preprocess(data_train,run_paint_or_ml)
    data_test, X_test, y_test = run_preprocess(data_test,run_paint_or_ml)
    data_all, X_all, y_all = run_preprocess(data_all,run_paint_or_ml)
    ###### 2. 模型选择、训练、预测
    if run_paint_or_ml==2:

        #
        ###### 2.3 随机森林
        pred=run_RandomForest(X_train, y_train, X_test, y_test, 0.1)
        scores(pred,y_test)


if __name__=="__main__":
    main()



二,显示

py sk.py

因为是随机森林模型 所以每次 结果都不一样

总结

这个是 我 2020的时候写了,希望对大家有帮助



目录
相关文章
|
4天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能质量检测与控制
使用Python实现深度学习模型:智能质量检测与控制 【10月更文挑战第8天】
88 62
使用Python实现深度学习模型:智能质量检测与控制
|
1天前
|
机器学习/深度学习 TensorFlow 调度
使用Python实现深度学习模型:智能能源消耗预测与管理
使用Python实现深度学习模型:智能能源消耗预测与管理
54 30
|
2天前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
11 3
|
2天前
|
机器学习/深度学习 传感器 数据采集
使用Python实现深度学习模型:智能设备故障预测与维护
【10月更文挑战第10天】 使用Python实现深度学习模型:智能设备故障预测与维护
39 2
|
2天前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
9 1
|
4天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!
|
5天前
|
机器学习/深度学习 数据采集 数据挖掘
探索Python编程的奥秘
【10月更文挑战第7天】本文将带你走进Python的世界,探索其背后的逻辑与魅力。我们将从基础语法开始,逐步深入到函数、面向对象编程等高级特性,最后通过实际项目案例,让你体验Python的强大与便捷。无论你是编程新手,还是有一定基础的开发者,都能在这篇文章中找到你需要的信息和启发。
|
6天前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!
|
3天前
|
数据采集 开发框架 数据处理
探索Python的灵活性:简化日常编程任务
【10月更文挑战第7天】 【10月更文挑战第9天】 在本文中,我们将深入探讨Python编程语言的强大功能和灵活性。通过具体的代码示例,我们会展示如何利用Python简化日常编程任务,提高效率。无论是数据处理、自动化脚本还是Web开发,Python都能提供简洁而强大的解决方案。我们还将讨论一些最佳实践,帮助你编写更清晰、更高效的代码。
7 1
|
8天前
|
存储 人工智能 Java
Python编程入门:从基础到实战
【10月更文挑战第4天】本文旨在为初学者提供一个全面而深入的Python编程学习路径。我们将从Python的基本语法和概念开始,然后逐步深入到更复杂的主题,如数据结构、面向对象编程和异常处理等。最后,我们将通过一些实际的项目案例,帮助读者将理论知识应用到实践中去。无论你是编程新手,还是有一定经验的开发者,都可以在这篇文章中找到适合自己的学习内容。让我们一起开启Python编程的学习之旅吧!