首先,树模型参数有:
1. criterion gini or entopy
2. splitter best or random 前者是在所有特征中找到最好切分点,后者是在部分特征中(数据量比较大时)
3. max_features None(所有) log2,sqrt,N特征小于50时一般使用所有特征
4. max_depth 数据少或特征少的时候可以不管这个值,如果模型样本量、特征多的情况下,可以尝试限制
5. min_samples_split 如果节点样本数少于min_samples_split,则不会继续尝试选择最优特征来划分。若样本数量级非常大,推荐增大这个值。
6. min_samples_leaf 限制叶子节点最少的样本数,如果叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
7. min_weight_fraction 限制叶子节点所有样本权重和的最小值
8. max_leaf_nodes 限制最大叶子节点数,防止过拟合
9. class_weight 指定样本类别权重,防止训练集某些类别的样本过多导训练的决策树过于偏向这些类别。可指定balanced,自动计算,样本量少的类别对应的样本权重会高。
10. min_inpurity_split 限制决策树的增长,若干节点不纯度(基尼系数、信息增益、均方差、绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点。
- n_estimators:树的个数
1. 例子,首先导入数据集
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
#导入数据集
from sklearn.datasets.california_housing import fetch_california_housing
housing=fetch_california_housing()
print(housing.DESCR)
通过print(housing.DESCR)函数,展示数据集的基本描述信息。
2. 少量查看数据:
print('数据集shape:',housing.data.shape)
print('因变量查看',housing.target[0:2])
pd.DataFrame(housing.data).head(2)
3. 进行决策树建模:
from sklearn import tree
dtr=tree.DecisionTreeRegressor(max_depth=2)
dtr.fit(housing.data[:,[6,7]],housing.target)
DecisionTreeRegressor(ccp_alpha=0.0,criterion=‘mse’,max_depth=2,
--------------------------------max_features=None, max_leaf_nodes=None,
--------------------------------min_impurity_decrease=0.0, min_impurity_split=None,
--------------------------------min_samples_leaf=1, min_samples_split=2,
--------------------------------min_weight_fraction_leaf=0.0, presort=‘deprecated’,
--------------------------------random_state=None, splitter=‘best’)
4. 可视化展示决策树
'''
若python找不到graphviz,可以加上
import os
os.environ["PATH"]=os.pathsep+'graphviz安装路径下的bin文件夹'
os.environ["PATH"]=os.pathsep+'D:\graphviz\bin'
'''
from sklearn.tree import export_graphviz
from IPython.display import Image
import pydotplus
from sklearn.externals.six import StringIO
4.1 可视化pdf文件
import pydotplus
dot_data=tree.export_graphviz(dtr,out_file=None)
graph=pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf('housing.pdf')
4.2 直接展示图片
from IPython.display import Image
dot_data=tree.export_graphviz(dtr,
out_file=None,
feature_names=housing.feature_names[6:8],
class_names=housing.target,
filled=True, #是否填充颜色
impurity=False, #是否展示mse(决策回归树)
rounded=True, #决策树格子形状
special_characters=True)
graph=pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')
Image(graph.create_png())
#保存成图片
graph.write_png('dtr_white_background.png')
5. 分割数据集再训练
from sklearn.model_selection import train_test_split
data_train,data_test,y_train,y_test=\
train_test_split(housing.data,housing.target,
test_size=0.1,random_state=42)
dtr=tree.DecisionTreeRegressor(random_state=42)
dtr.fit(data_train,y_train)
dtr.score(data_test,y_test)
0.637355881715626
输出准确率0.64
6. 简单随机森林
from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor(random_state=42)
rfr.fit(data_train,y_train)
rfr.score(data_test,y_test)
0.8097021394052101
准确率提高到0.81
6.1 网格搜索调参
from sklearn.model_selection import GridSearchCV
tree_param_grid={'min_samples_split':list((3,6,9)),
'n_estimators':list((10,50,100))}
grid=GridSearchCV(RandomForestRegressor(),
param_grid=tree_param_grid,
cv=5)
grid.fit(data_train,y_train)
# ~~grid.grid_scores_~~此版本已删除
print('所有',grid.cv_results_['mean_test_score'])
print('最佳',grid.best_params_,grid.best_score_)
利用网格搜索函数,验证最合适的参数组合,在数据集较大且搜索参数较多时,时间花费较长。
可以使用热力图展示参数组合得分:
import numpy as np
#可视化2个参数的
grid_visual=[]
for params in grid.cv_results_['mean_test_score']:
grid_visual.append(params)
grid_visual=np.array(grid_visual)
grid_visual.shape=(3,3) #转换为3*3结构
grid_visual
这里注意,结果转换后,行与列分别表示什么含义要搞清楚,通过查看grid.cv_results可以得知,参数组合是(3,3,3,6,6,6,9,9,9)(10,50,100,10,50,100,10,50,100),因此,转换结构后,行分别表示3,6,9,列分别表示10,50,100,这一点在作热力图时需注意!
#作热力图
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(grid_visual,cmap='Blues')
plt.yticks(np.arange(3)+0.5,grid.param_grid['min_samples_split'])#[::-1])
plt.xticks(np.arange(3)+0.5,grid.param_grid['n_estimators'])#[::-1]) #?
plt.xlabel('n_estimators')
plt.ylabel('min_samples_split')
6.2 选择合适参数建模:
rfr=RandomForestRegressor(min_samples_split=3,
n_estimators=100,
random_state=42)
rfr.fit(data_train,y_train)
rfr.score(data_test,y_test)
0.8088623476993486
准确率为0.81
6.3 输出变量重要性
pd.Series(rfr.feature_importances_,
index=housing.feature_names).sort_values(ascending=False)
MedInc 0.524257
AveOccup 0.137947
Latitude 0.090622
Longitude 0.089414
HouseAge 0.053970
AveRooms 0.044443
Population 0.030263
AveBedrms 0.029084
dtype: float64