首先,树模型参数有:

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)函数,展示数据集的基本描述信息。

python查看决策树预测准确率 python决策树参数_python查看决策树预测准确率

2. 少量查看数据:

print('数据集shape:',housing.data.shape)
print('因变量查看',housing.target[0:2])
pd.DataFrame(housing.data).head(2)

python查看决策树预测准确率 python决策树参数_数据集_02

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')

python查看决策树预测准确率 python决策树参数_子节点_03

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_)

python查看决策树预测准确率 python决策树参数_决策树_04


利用网格搜索函数,验证最合适的参数组合,在数据集较大且搜索参数较多时,时间花费较长。

可以使用热力图展示参数组合得分:

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

python查看决策树预测准确率 python决策树参数_决策树_05


这里注意,结果转换后,行与列分别表示什么含义要搞清楚,通过查看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')

python查看决策树预测准确率 python决策树参数_python查看决策树预测准确率_06

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