(DecisionTreeRegressor)决策树回归实例-加州房价数据 学习笔记

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.dataset.california_housing import fetch_california_housing
# 读取加州房价数据
housing = fetch_california_housing()
#print(housing.DESCR)
#housing.data.shape
#housing.data[0]

# 决策树建模
from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data, housing.target)

# 可视化显示
dot_data = tree.export_graphviz(dtr, out_file=None, feature_names=housing.feature_names, filled=True, impurity=False, rounded=True)

import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')

from IPython.display import Image
Image(graph.create_png())

在这里插入图片描述

#划分测试集和训练集
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.2,random_state=42)
#决策树回归
dtr = tree.DecisionTreeRegressor(random_state=42)
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)

0.6180987541625789

#随机森林回归
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state=42)
rfr.fit(data_train, target_train)
rfr.score(data_test, target_test)

0.7840229865427347

from sklearn.model_selection import GridSearchCV
#网络搜索
tree_param_grid = {'min_sample_split':[3,6,9], 'n_estimators':[10,50,100]}
# min_samples_split:分裂内部节点需要的最少样例数.int(具体数目),float(数目的百分比) 
# n_estimators:森林中数的个数。这个属性是典型的模型表现与模型效率成反比的影响因子,即便如此,你还是应该尽可能提高这个数字,以让你的模型更准确更稳定。
grid = GridSearchCV(RrandomForestRegressor(), param_grid=tree_param_grid, cv=5)
grid.fit(data_train, target_train)
grid.cv_results_['mean_test_score'], grid.cv_results_['std_test_score'], grid.best_params_, grid.best_score_

Out:
array([0.7856506 , 0.8024427 , 0.80406976, 0.7829197 , 0.8010626 ,
        0.80376552, 0.78888937, 0.80097987, 0.80215882]),
 array([0.0050829 , 0.00462365, 0.00524954, 0.00628353, 0.0055278 ,
        0.00500921, 0.0065627 , 0.00387998, 0.00517869]),
 {'min_samples_split': 3, 'n_estimators': 100},
 0.8040697599423097
# 设定好min_samples_split和n_estimators参数,再做随机森林回归
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.8047053763276765

# 特征重要性
pd.Series(rfr.feature_importances_, index=housing.feature_names).sort_values(ascending=False)

Out:
MedInc        0.526711
AveOccup      0.138456
Latitude      0.088882
Longitude     0.088478
HouseAge      0.054221
AveRooms      0.043936
Population    0.030211
AveBedrms     0.029105
dtype: float64

版权声明:本文为sanjianjixiang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。