一个 python + 数据预处理+随机森林模型 (案列)
本次使用的是 样本可以去 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的时候写了,希望对大家有帮助