欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习决策树笔记

程序员文章站 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_

机器学习决策树笔记