一个 python + 数据预处理+随机森林模型 (案列)
本次使用的是 样本可以去 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.每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。
准备
请先安装下面的库
powershell
pip install sklearn
pip install pandas
pip install joblib
一、python 代码
深度学习和强化学习都需要丰富的词汇来定义架构
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()
二,显示
sql
py sk.py
因为是随机森林模型 所以每次 结果都不一样
总结
这个是 我 2020的时候写了,希望对大家有帮助