机器学习小实战(二) 建立决策树

目录

一、决策树简介

二、构造决策树的小栗子

三、随机森林进行决策

四、通过交叉验证将各特征进行排序


一、决策树简介

决策树既可以分类,也可以回归。构造决策树两种方式:预剪枝/后剪枝

难点:如何构造决策树,选什么特征作为结点。

特点:根节点是分类效果最好的,其余次之、再次之。

决策树停止划分结点的原因可能是:达到最大叶子节点数了、叶子结点样本数够少了、未达到划分结点的衡量标准(e.g 信息熵变化不明显)等等

 

二、构造决策树的小栗子

就用sklearn中自带的一个数据集进行演示

1. 读取数据、了解分布情况

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets.california_housing import fetch_california_housing #采用内置数据集

housing=fetch_california_housing()
print(housing.DESCR) #关于这个数据集的简介
print(housing.data.shape) #(20640, 8)
print(type(housing))  #<class 'sklearn.utils.Bunch'>
print(housing.data[0]) #输出一行数据瞅瞅啥样

输出:关于这个数据集的介绍,从简介中可以看出,这个数据集包含8个属性:average income,housing average age, average rooms, average bedrooms, population,average occupation, latitude, and longitude 

2. 数据预处理

因为是自带的数据库,数据没啥大问题,这步忽略,进入下一步

3. 建立决策树模型

为了简化模型,我们只考虑最后两项特征(经纬度)对房屋价格的影响

# 构造决策树
from sklearn import tree
dtr=tree.DecisionTreeRegressor(max_depth=2) #第一步:实例化树模型——传递参数
dtr.fit(housing.data[:,[6,7]],housing.target) #第二步:构造树模型——传入X值与y值

输出:这个树的信息,构造过程用的参数情况,可以看到有非常多的参数,但要去设置的也不多,最重要的是max_depth和max_leaf_nodes。

DecisionTreeRegressor(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=False, random_state=None, splitter='best')

各参数的含义:

4. 决策树的可视化显示

此处要安装graphviz,在官网(http://www.graphviz.org/Download_windows.php)下载安装就可以了

# 先生成.dot文件
dot_data= \
    tree.export_graphviz(
        dtr, # 决策树的名字
        out_file=None,
        feature_names=housing.feature_names[6:8],#特征名字
        filled=True,
        impurity=False,
        rounded=True
    )

# 对.dot文件进行显示
import pydotplus  #pip install  pydotplus
graph=pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')
from IPython.display import Image #notebook中不需要安装,但是pycharm中需要安装
Image(graph.create_png())

# 保存到本地
graph.write_png('dtr_white_background.png')

结果:

5. 决策树的评估 .score

重新建立了一个决策树,把所有的性质都用上了

from sklearn.model_selection import train_test_split
data_train,data_test,target_train, target_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, target_train)
dtr.score(data_test, target_test)

输出:0.637318351331017

 

三、随机森林进行决策

1. 通过随机森林进行决策

from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor(random_state=42)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test)

输出:0.7908649228096493

四、通过交叉验证将各特征进行排序

1. 交叉验证

## 交叉验证选出最好的参数
from sklearn.grid_search 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, target_train)
grid.grid_scores_, grid.best_params_, grid.best_score_

结果:

([mean: 0.78590, std: 0.00274, params: {'min_samples_split': 3, 'n_estimators': 10},
  mean: 0.80537, std: 0.00404, params: {'min_samples_split': 3, 'n_estimators': 50},
  mean: 0.80774, std: 0.00387, params: {'min_samples_split': 3, 'n_estimators': 100},
  mean: 0.78896, std: 0.00314, params: {'min_samples_split': 6, 'n_estimators': 10},
  mean: 0.80562, std: 0.00407, params: {'min_samples_split': 6, 'n_estimators': 50},
  mean: 0.80690, std: 0.00366, params: {'min_samples_split': 6, 'n_estimators': 100},
  mean: 0.78679, std: 0.00504, params: {'min_samples_split': 9, 'n_estimators': 10},
  mean: 0.80455, std: 0.00470, params: {'min_samples_split': 9, 'n_estimators': 50},
  mean: 0.80557, std: 0.00411, params: {'min_samples_split': 9, 'n_estimators': 100}],
 {'min_samples_split': 3, 'n_estimators': 100},
 0.8077425553717694)

2. 用最好的一组参数构建决策树

# 用筛选出来最好的参数来构造决策树
rfr=RandomForestRegressor(min_samples_split=3,n_estimators=100,random_state=42)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test) #0.8090829049653158

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

猜你喜欢

转载自blog.csdn.net/qq_39915585/article/details/81325207