likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 5

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

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

下载boci_trial_0423.csv

也可以见文档


@TOC


前言

这个是之前写的一个 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.每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。


准备

[下载帮助文档]

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

请先安装下面的库

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

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

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

总结

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