sklearn
分类树
- 模块中的sklearn.tree
tree.DecisionTreeClassifier | 分类树 |
---|---|
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 将生成的决策树导出为DOT格式,画图专用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
- 建模流程
实例化–>通过模型接口训练模型–>通过模型接口提取需要的信息
分类代码:
from sklearn import tree
clf = tree.DecisionTreeCLassifier() #实例化
clf = clf.fit(X_train, y_train) #用训练集数据训练模型
result = clf.score(X_test, y_test) #导入测试集,从接口中调用需要的信息
即使训练集的数据相同,最后得出的模型也不同—>所以创建一个森林–>从森林里选出一个最优模型。
分支对树的不纯度,随机选取一部分特征,从随机的一部分里选出最优特征来创建树。
导致每次树的随机性,可以通过random_state来运行代码得到相同的随机结果。
random_state=30,设置分支中随机模式的参数。输入任意整数,会一直长出同一棵树,让模型稳定。
分类树的参数 | |
---|---|
criterion | 决定不纯度的计算方法。entropy信息熵和gini基尼系数。 |
random_state | 通过设置相同的随机种子,每次运行代码时将得到相同的随机结果 |
splitter | 常见的取值有 “best” 和 “random”。默认值是 “best”,表示选择最优的分裂点。而 “random” 则表示从随机特征子集中选择最佳分裂点。 |
- 基尼系数和信息熵两者怎么使用:
数据维度很大,噪音很大时使用基尼系数 维度低,数据比较清晰的时候,信息熵和基尼系数没区别 当决策树的拟合程度不够的时候,使用信息熵
- 后两个参数可通过调参,使得模型的score达到最大,选出最优解。
剪枝参数调优
模型score太高导致模型过拟合。优化决策树。
调参 | |
---|---|
max_depth | 限制树的最大深度 |
min_simples_leaf | 限制子叶节点个数,小于个数被砍掉,建议从5开始 |
min_samples_split | 限制父子叶节点,子叶节点小于指定个数,不允许往下分裂 |
max_features | 限制分枝时特征个数 ,超过个数的特征都会被舍弃 |
min_impurity_decrease | 限制信息增益的大小,信息增益小于设定数值的分支不会发生 |
超参数的曲线
**超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线。**因此,可以使用超参数的曲线来衡量不同超参数取值下模型表现的线。
import matplotlib.pyplot as plt
test = []
for i in range(10):# 修改树的最大深度,做图找到最合适的点
clf = tree.DecisionTreeClassifier(max_depth=i+1
,criterion="entropy"
,random_state=30
,splitter="random"
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend() # 展示图例
plt.show() # 做图
剪枝参数的默认值会让树无穷无尽的生长,如果数据集非常大,可以提前设定剪枝参数来控制树的复杂性和大小。
目标权重参数
class_weight | 样本标签平衡,向少数类标签偏移,模型更偏向少数类 |
---|---|
min_weight_fraction_leaf | 基于权重的剪枝参数 |
重要属性和接口
#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)
回归树
交叉验证
样本划分:我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份 作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此 用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
在多次建模后求得分,得出的最终结果求和取平均,得到的n次的平均得分情况。
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10,
scoring = "neg_mean_squared_error")
#交叉验证cross_val_score的用法
模型中使用的数据不能是一维数据,可以通过以下方法进行数据升维(sklearn不接受一维矩阵):
# 方法一:
array.shape(-1,1)
# 方法二:
arr = np.array([1, 2, 3, 4, 5])
column_arr = arr[:, np.newaxis]
对于target数据,可以采用降维的方式:
arr = np.array([[1, 2, 3], [4, 5, 6]])
raveled_arr = np.ravel(arr)
重要参数,属性和接口
criterion | mse:均方误差;friedman_mse:费尔德曼均方误差;mae:绝对平均误差 |
---|
在回归树中,mse是分枝质量衡量指标,也是最常用的衡量回归树回归质量的指标。
回归树的接口score返回的是R的平方,并不是MSE。
用scoring参数可以调整score的返回值,若返回的是均方误差,注意:均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“。
数据预处理
# 读取数据的表格
data = pd.read_csv(r"D:\python\test\data.csv")
# 表格的详细数据
data.info()
# 表格的前五行数据
data.head()
# 筛选数据的操作
# 删除表格中不重要的数据
# 列表中的数据为删除的标签名,inplace代表删除后的数据取代原先的数据
# axis代表删除列方向上的数据
data.drop(['列名'],inplace=True,axis=1)
# 填补数据的操作
# 以fillna中的方式进行填充,有均值,等等一系列填充方法
data[] = data[].fillna(填充方法)
# 删除少量不全的数据,只要数据不全就被删除
data = data.dropna()
# 取出特定特征值,并对数据进行压缩,找出该类的取值种类
# 将三分类变量转换为数值型变量,替换方式为0,1,2
# 但又抛出一个问题,三分类变量之前相互无关系,但是变为数字之后,三者之间又有了相对关系
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))
# 方法二
data["Sex"] = (data["Sex"] == "male").astype("int")
# 取值更为规范
data.loc[:,"Sex"] # 取标签
data.iloc[:,"2"] # 取列号,也可以用包含bool值的列表
data.iloc[:,(data.columns != "Survived")] # 取不等于Survived的值的列
# 调整测试集中的序号编码
for i in [Xtrain, Xtest, Ytrain, Ytest]:
i.index = range(i.shape[0])
网格搜索
同时调整多个参数的技术,枚举技术
import numpy as np
# 生成一串0,0.5之间20个顺序等差数列
gini_thresholds = np.linspace(0,0.5,20)
# 提前规定网格搜索的范围
parameters = {'splitter':('best','random')
,'criterion':("gini","entropy")
,"max_depth":[*range(1,10)]
,'min_samples_leaf':[*range(1,50,5)]
,'min_impurity_decrease':[*np.linspace(0,0.5,20)]
}
# 建立模型
clf = DecisionTreeClassifier(random_state=25)
# 网格搜索+交叉验证
GS = GridSearchCV(clf, parameters, cv=10)
# 训练模型
GS.fit(Xtrain,Ytrain)
# 网格搜索中最优参数
GS.best_params_
# 网格搜索中最优参数下的得分
GS.best_score_
决策树的优缺点
决策树优点
- 易于理解和解释,因为树木可以画出来被看见
- 需要很少的数据准备。其他很多算法通常都需要数据规范化,需要创建虚拟变量并删除空值等。但请注意, sklearn中的决策树模块不支持对缺失值的处理。
- 使用树的成本(比如说,在预测数据的时候)是用于训练树的数据点的数量的对数,相比于其他算法,这是一个很低的成本。
- 能够同时处理数字和分类数据,既可以做回归又可以做分类。其他技术通常专门用于分析仅具有一种变量类 型的数据集。
- 能够处理多输出问题,即含有多个标签的问题,注意与一个标签中含有多种标签分类的问题区别开
- 是一个白盒模型,结果很容易能够被解释。如果在模型中可以观察到给定的情况,则可以通过布尔逻辑轻松解释条件。相反,在黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。
- 可以使用统计测试验证模型,这让我们可以考虑模型的可靠性。
- 即使其假设在某种程度上违反了生成数据的真实模型,也能够表现良好。
决策树的缺点
- 决策树学习者可能创建过于复杂的树,这些树不能很好地推广数据。这称为过度拟合。修剪,设置叶节点所需的最小样本数或设置树的最大深度等机制是避免此问题所必需的,而这些参数的整合和调整对初学者来说会比较晦涩
- 决策树可能不稳定,数据中微小的变化可能导致生成完全不同的树,这个问题需要通过集成算法来解决。
- 决策树的学习是基于贪婪算法,它靠优化局部最优(每个节点的最优)来试图达到整体的最优,但这种做法不能保证返回全局最优决策树。这个问题也可以由集成算法来解决,在随机森林中,特征和样本会在分枝过程中被随机采样。
- 有些概念很难学习,因为决策树不容易表达它们,例如XOR,奇偶校验或多路复用器问题。
- 如果标签中的某些类占主导地位,决策树学习者会创建偏向主导类的树。因此,建议在拟合决策树之前平衡数据集