机器学习决策树笔记
程序员文章站
2022-03-30 16:33:09
...
import pandas as pd
iris_data = pd.read_csv('iris.data')
iris_data.columns = ['sepal_length_cm', 'sepal_width_cm', 'petal_length_cm', 'petal_width_cm', 'class']
iris_data.head()
import matplotlib.pyplot as plt
iris_data.hist()
from PIL import Image
img=Image.open('test.jpg')
plt.imshow(img)
plt.show()
iris_data.describe()
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sb
#数据集去空之后,对数据集进行类别分布的可视化
sb.pairplot(iris_data.dropna(), hue='class')
iris_data.columns
plt.figure(figsize=(15, 15))
#循环提取iris_data数据的给个列标签与列标签的索引赋值
for column_index, column in enumerate(iris_data.columns):
#类别数据的话跳过
if column == 'class':
continue
plt.subplot(2, 2, column_index + 1)
#绘制单变量,与类别数据分布的小提琴图
sb.violinplot(x='class', y=column, data=iris_data)
from sklearn.model_selection import train_test_split
#合并待处理样本的列数据
all_inputs = iris_data[['sepal_length_cm', 'sepal_width_cm',
'petal_length_cm', 'petal_width_cm']].values
#目标样本分类
all_classes = iris_data['class'].values
#拆分数据集,
(training_inputs,
testing_inputs,
training_classes,
testing_classes) = train_test_split(all_inputs, all_classes, test_size=0.3, random_state=1)
#导入决策树的DTC包
from sklearn.tree import DecisionTreeClassifier
# 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 这个值限制了决策树的增长,如果某节点的不纯度
# (基尼系数,信息增益,均方差,绝对差)小于这个阈值
# 则该节点不再生成子节点。即为叶子节点 。
#所有参数均设置为默认状态
decision_tree_classifier = DecisionTreeClassifier()
# 在训练集上训练分类器
decision_tree_classifier.fit(training_inputs, training_classes)
# 利用分类精度验证测试集上的分类器
decision_tree_classifier.score(testing_inputs, testing_classes)
from sklearn.model_selection import cross_val_score #交叉验证
import numpy as np
decision_tree_classifier = DecisionTreeClassifier()
# cross_val_score returns a list of the scores, which we can visualize
# to get a reasonable estimate of our classifier's performance
#10次交叉验证
cv_scores = cross_val_score(decision_tree_classifier, all_inputs, all_classes, cv=10)
print (cv_scores)
#kde=False
sb.distplot(cv_scores)
plt.title('Average score: {}'.format(np.mean(cv_scores)))
#设置决策树最大的深度,避免模型股过拟合
decision_tree_classifier = DecisionTreeClassifier(max_depth=1)
cv_scores = cross_val_score(decision_tree_classifier, all_inputs, all_classes, cv=10)
print (cv_scores)
sb.distplot(cv_scores, kde=False)
plt.title('Average score: {}'.format(np.mean(cv_scores)))
from sklearn.model_selection import GridSearchCV #模型调优,填入模型会自动调优
from sklearn.model_selection import StratifiedKFold #分层采样数据
decision_tree_classifier = DecisionTreeClassifier()
#设置最大深度,与叶子节点的最大类别特征
parameter_grid = {'max_depth': [1, 2, 3, 4, 5],
'max_features': [1, 2, 3, 4]}
#数据切割数
skf = StratifiedKFold(n_splits=10)
cross_validation = skf.get_n_splits(all_inputs, all_classes)
#采用决策树分类器。第一个参数为分类,第二个参数为填入需要调优的参数,类型为列表或字典。第三个为需要交叉严验证的数据。
grid_search = GridSearchCV(decision_tree_classifier, param_grid=parameter_grid,cv=cross_validation)
#对测试的样本就行预测
grid_search.fit(all_inputs, all_classes)
print("Best score:", grid_search.best_score_)
print("Best param:", grid_search.best_params_)
#可视化评分选择
grid_visualization = []
#对每一个评分,计算均值评分,并追加到列表中。grid_search.cv_results_为决策树分类器交叉验证的结果
for grid_pair in grid_search.cv_results_['mean_test_score']:
grid_visualization.append(grid_pair)
#是数据列表变成数组
grid_visualization = np.array(grid_visualization)
#设置数组的维度
grid_visualization.shape = (5, 4)
#绘制热力图
sb.heatmap(grid_visualization, cmap='Reds')
#x的值为最大特征
plt.xticks(np.arange(4) + 0.5, grid_search.param_grid['max_features'])
#y的值为最大深度,这里对结果数据进行了一次逆序
plt.yticks(np.arange(5) + 0.5, grid_search.param_grid['max_depth'][::-1])
plt.xlabel('max_features')
plt.ylabel('max_depth')
decision_tree_classifier = grid_search.best_estimator_
decision_tree_classifier
import sklearn.tree as tree
from sklearn.externals.six import StringIO
with open('iris_dtc.dot', 'w') as out_file:
out_file = tree.export_graphviz(decision_tree_classifier, out_file=out_file)
#http://www.graphviz.org/
import pydotplus
from IPython.display import Image
dot_data = tree.export_graphviz(decision_tree_classifier, out_file=None, feature_names=iris_data.columns[0:4], class_names=iris_data.columns[0:-1], filled=True, rounded=True, special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
random_forest_classifier = RandomForestClassifier()
parameter_grid = {'n_estimators': [5, 10, 25, 50],
'criterion': ['gini', 'entropy'],
'max_features': [1, 2, 3, 4],
'warm_start': [True, False]}
skf = StratifiedKFold(n_splits=10)
cross_validation = skf.get_n_splits(all_inputs, all_classes)
# cross_validation = StratifiedKFold(n_splits=10)
grid_search = GridSearchCV(random_forest_classifier,
param_grid=parameter_grid,
cv=cross_validation)
grid_search.fit(all_inputs, all_classes)
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))
grid_search.best_estimator_