python--随机森林建模3(调参)
以下内容笔记出⾃‘跟着迪哥学python数据分析与机器学习实战’,外加个⼈整理添加,仅供个⼈复习使⽤。
这⾥是在新数据集建模的基础上进⾏调参。
⾸先导⼊数据,划分测试集与训练集:
1. 原数据建模
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
ad_csv(r'temps_extended.csv')
print(features.shape)
features.head(6)
处理数据
#哑编码
_dummies(features)
#划分训练集与测试集
labels=features['actual']
features_x=features.drop('actual',axis=1)
feature_list=list(lumns)
import numpy as np
features_x=np.array(features_x)
labels=np.array(labels)
del_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(features_x,labels,
test_size=0.25,
random_state=42)
print(X_train.shape,X_test.shape)linspace numpy
(1643, 17) (548, 17)
2. 选择重要变量建模
#选择6个最重要变量
imp_features=['temp_1','average','ws_1','temp_2',
'friend','year']
#到她们的索引,挑选数据
imp_features_indices=[feature_list.index(feature)
for feature in imp_features]
imp_X_train=X_train[:,imp_features_indices]
imp_X_test=X_test[:,imp_features_indices]
2.1 调节参数
先打印出所有参数看看:
#打印出所有的参数
semble import RandomForestRegressor
rf=RandomForestRegressor(random_state=42)
from pprint import pprint
_params())
参数的的可能组合有很多,可以使⽤⽹格搜索,但当参数的候选值较多时,建模的时间会拉长。函数:
RandomizedSearchCV(),可以帮助我们在候选集组合中,不断地随机选择⼀组合适的参数来建模,并且求其交叉验证后的评估结果。
2.2 参数调节
这⾥是做个例⼦:
del_selection import RandomizedSearchCV
#树个数
n_estimators=[int(x)for x in np.linspace(start=200,
stop=2000,num=10)]
#最⼤特征选择⽅式
max_features=['auto','log2']
#默认auto=sqrt(n_features) 与sqrt相同
#树最⼤深度
max_depth=[int(x)for x in np.linspace(10,20,num=2)]
max_depth.append(None)
#节点最⼩分裂所需样本数
min_samples_split=[2,5,10]
#叶⼦节点最⼩样本数,任何分裂不能让其⼦节点样本数⼩于此值
min_samples_leaf=[1,2,4]
#样本采样⽅法
bootstrap=[True,False]
#⾃助采样:有放回的均匀抽样
random_grid={'n_estimators':n_estimators,
'max_features':max_features,
'max_depth':max_depth,
'min_samples_split':min_samples_split,
'min_samples_leaf':min_samples_leaf,
'bootstrap':bootstrap}
rf=RandomForestRegressor()
rf_random=RandomizedSearchCV(estimator=rf,
param_distributions=random_grid,
#参数组合空间
n_iter=100,
#随机寻参数组合的个数,这⾥组合100组,然后最好的⼀组
scoring='neg_mean_absolute_error',
cv=3,verbose=2,
#verbose打印信息的数量
random_state=42,
n_jobs=-1#多线程跑程序,如果⽤-1就会⽤所有的)
#执⾏
rf_random.fit(imp_X_train,y_train)
即便设成n_jobs=-1,程序运⾏的还是很慢,因为建⽴100次模型来选择参数,并且带有3折交叉验证,相当于300个任务。#最好参数
rf_random.best_params_
{‘n_estimators’: 200,
‘min_samples_split’: 10,
‘min_samples_leaf’: 4,
‘max_features’: ‘auto’,
‘max_depth’: None,
‘bootstrap’: True}
评估函数
#建⽴评估函数
def evaluate(model,X_test,y_test):
predictions=model.predict(X_test)
errors=abs(predictions-y_test)
mape=an(errors/y_test)
accuracy=100-mape
print('平均误差:',np.mean(errors))
print('acc:',accuracy)
2.3 旧模型准确率
base_model=RandomForestRegressor(random_state=42)
base_model.fit(imp_X_train,y_train)
evaluate(base_model,imp_X_test,y_test)
平均误差: 3.829032846715329
acc: 93.55535365977748
2.4 新模型准确率
best_random=rf_random.best_estimator_
evaluate(best_random,imp_X_test,y_test)
平均误差: 3.724228284195437
acc: 93.71412777231247
3. 交叉验证
可以看到模型效果有所提升,但已经到上限了吗?接下来可以⽤⽹格搜索交叉验证,GridSearchCV(),⼀个个组合遍历.随机选择的最好参数是:
{'n_estimators': 200,
'min_samples_split': 10,
'min_samples_leaf': 4,
'max_features': 'auto',
'max_depth': None,
'bootstrap': True}
del_selection import GridSearchCV
#⽹格搜索
param_grid={
'bootstrap':[True],
'max_depth':[8,10,12],
'max_features':['auto'],
'min_samples_leaf':[2,3,4,5,6],#节点分裂最⼩样本
'min_samples_split':[3,5,7],#叶⼦节点最⼩样本值越⼩,越易分裂,树越⼤
'n_estimators':[800,900,1000,1200]
}
#基础模型
rf=RandomForestRegressor(random_state=42)
grid_search=GridSearchCV(estimator=rf,
param_grid=param_grid,
scoring='neg_mean_absolute_error',
cv=3,n_jobs=-1,verbose=2)
grid_search.fit(imp_X_train,y_train)
grid_search.best_params_
{‘bootstrap’: True,
‘max_depth’: 8,
‘max_features’: ‘auto’,
‘min_samples_leaf’: 6,
‘min_samples_split’: 3,
‘n_estimators’: 900}
best_grid=grid_search.best_estimator_
evaluate(best_grid,imp_X_test,y_test)
平均误差: 3.673594482591628
acc: 93.79803527746205
准确率较上次还是有所提⾼的!
4. 另⼀组参数
经过再次调整后,模型准确率有所提升。再⽤⽹格搜索的时候,遍历次数太多,通常并不把所有的可能性都放进去,⽽是分成不同的组来分别执⾏,下⾯看⼀下另外⼀组⽹格搜索。
param_grid={
'bootstrap':[True],
'max_depth':[12,15,None],
'max_features':[3,4,'auto'],
'min_samples_leaf':[5,6,7],
'min_samples_split':[7,10,13],
'n_estimators':[900,1000,1200]
}
rf=RandomForestRegressor(random_state=42)
grid_search_ad=GridSearchCV(estimator=rf,
param_grid=param_grid,
scoring='neg_mean_absolute_error',
cv=3,
n_jobs=-1,verbose=2)
grid_search_ad.fit(imp_X_train,y_train)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。