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版权协议,转载请附上原文出处链接和本声明。