加州房价--决策树与随机森林

需要新装包

'''decisionTree  写在前面
要安装http://www.graphviz.org/download/ 测试是否安装成功 dot -version 修改环境变量 
pip install graphviz 提示:Successfully installed graphviz-0.20
pip install pydotplus
'''
#===================================

import matplotlib.pyplot  as plt
import pandas as pd
from sklearn import tree 
#从sklearn.datasets中调用数据集
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import GridSearchCV
#报错--GraphViz's executables not found----C:\Program Files\Graphviz\bin环境变量,!!!!新安装完成后,记得重启!!!!!
import os
os.environ["PATH"]+=os.pathsep+"C:\Program Files\Graphviz\bin"


housing = fetch_california_housing()
print(housing)
print(housing.DESCR)
print(housing.data.shape)
print(housing.target.shape)

dtr= tree.DecisionTreeRegressor(max_depth=2)#树最大深度是2
# dtr.fit(housing.data[:,[6,7]],housing.target) #导致出现错误ValueError: Length
dtr.fit(housing.data, housing.target)
# print(dtr.fit,"_"*50,housing.feature_names)

# 可视化显示
#运行tree.export_graphviz()方法时报错ValueError: Length of feature_names, 8 does not match number of features ,2  ,是方法里的feature_names参数出问题,feature_names定义的列不包括标签列,而且要和训练集的列数个数相同。
# print("--"*50,housing.feature_names)
#dot_data = tree.export_graphviz(dtr, out_file=None, feature_names=housing.feature_names[6:8], filled=True, impurity=False, rounded=True)

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')
print('#FFF2DD')
# graph.write_png('iris.png')
# graph.write_pdf('iris.pdf')
from IPython.display import display, Image#只在jupyter 中显示其他ide不行
#Image(graph.create_png())
# display(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.1,random_state =42)
#决策树回归
dtr = tree.DecisionTreeRegressor(random_state=42)
dtr.fit(data_train,target_train)
dtr.score(data_test,target_test)
print(dtr.fit,"-dtr-"*50,dtr.score)
 
#随机森林回归  
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state =42)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test)
print(rfr.fit,"-rfr-"*50,rfr.score)


#导入交叉验证选择参数模块
from sklearn.model_selection import GridSearchCV

# #创建可选参数字典
tree_param_grid = {'min_samples_split':list((3,6,9)),'n_estimators':list((10,50,100))}
# min_samples_split:分裂内部节点需要的最少样例数.int(具体数目),float(数目的百分比) 
# n_estimators:森林中数的个数。这个属性是典型的模型表现与模型效率成反比的影响因子,即便如此,你还是应该尽可能提高这个数字,以让你的模型更准确更稳定。
#创建选参对象,传入模型对象,参数字典,以及指定进行3折交叉验证
grid = GridSearchCV(RandomForestRegressor(),param_grid = tree_param_grid,cv = 3)

#向选参对象传入训练集数据
grid.fit(data_train,target_train)
#grid.grid_scores_ 得分,grid.best_params_最佳参数 ,grid.best_score_最佳得分
#打印各参数组合得分
print(grid.cv_results_['mean_test_score'])
#打印最佳参数及其得分
print(grid.best_params_, grid.best_score_)
'''
决策树是一种有监督的机器学习算法,该方法可以用于解决分类和回归问题。
决策树可以简单地理解为达到某一特定结果的一系列决策。决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。

随机森林是基于树的机器学习算法,该算法利用了多棵决策树的力量来进行决策。随机森林将单个决策树的输出整合起来生成最后的输出结果。
对于一个测试数据,将它投入到随机森林中的不同决策树中,会得到不同的测试结果。
若问题是一个分类问题,则可以通过求众数来得出测试数据的类别;若问题是一个回归问题,则可以通过求平均值得出测试数据的值。
这种结合了多个单一模型的输出(也被称为弱学习)的过程被称为集成学习。
'''


''' sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
1.criterion 标准有gini or entropy可以选择
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 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下5
7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了
8.max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到
9.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高
10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点
'''

参考:实战回归模型_兰钧的博客-CSDN博客

​​​​​​python做算法-决策树算法-Python实现_weixin_39640911的博客-CSDN博客

你可能感兴趣的:(五,决策树,随机森林,机器学习)