成功的机械学习有四个要素:数据,转化数据的模型,衡量模型好坏的损失函数和一个调整模型权重来最小化损失函数的算法。
1.数据: 越多越好的数据包括图片,结构数据,文本,声音
2.模型:通常数据和我们最终想要的相差很远,例如我们想知道照片中的人是不是高兴的,所以我们 需要把一千万像素变成一个高兴度的概率值。通常我们需要在数据上应用数个非线性函数(例如神经网络)
3.损失函数:我们需要对比模型的输出和真实值之间的误差。取决于我们想短线还是长线,这个函数可以很不一样。
4.训练:通常一个模型里面有很多参数。我们通过最小化损失函数来学这些参数。不幸的是,即使我们做得很好也不能保证在新的没见过的数据上我们可以仍然做很好。
训练误差:这是模型在评估用来训练模型的数据集上的误差。这个类似于考试前我们在模拟试 卷上拿到的分数。有一定的指向性,但不一定保证真实考试分数。
测试误差:这是模型在没见过的新数据上的误差,可能会跟训练误差不很一样(统计上叫过拟 合)。这个类似于考前模考次次拿高分,但实际考起来却失误了。
目标值:类别 (分类问题)
分类:k-近邻算法,贝叶斯分类,决策树与随机森林,逻辑回归
目标值:连续型的数据 (回归问题)
回归:线性回归,岭回归
决策数中的核心问题:
1)如何从数据表中找出最佳节点和最佳分枝?
sklearn中的决策树:
模块:sklearn.tree
tree.DecisionTreeClassifier | 分类树 |
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 画图专用,导出为dot格式 |
tree.ExtraTreeClassifier | 高随机版本分类树 |
tree.ExtraTreeRegressor | 高随机版本回归树 |
sklearn基本建模流程:
from sklearn import tree
clf = tree.DecisionTreeClassifier() #实例化
clf=clf.fit(xtrain,ytrain) #训练模型
result = clf.score(X_test,y_test) #导入测试集,查看模型的好坏
重要参数
class 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:这个参数用来决定不纯度的计算方法
1)entropy 使用信息熵(Entropy)
2)gini 使用基尼系数(Gini Impurity)
参数 | criterion |
如何影响模型 | 通过确定不纯度的计算方法,帮忙找出最佳节点和最佳分支,不纯度越低,拟合效果越好 |
有哪些计算方法 | gini(基尼系数)与entropy(信息熵) |
如何选择 | 通常选择基尼系数 噪声很大,维数大时选择基尼系数 通常两者可以都尝试一下,选取最优参数 |
建立一棵树:
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split #导入需要的库
wine=load_wine() #导入红酒数据集
wine.data.shape #查看红酒数据集的形状
wine.target #查看目标值
#分训练集和测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.taget,test test_size=0.3,random_state=3) #random_state 为随机数种子,test_size为测试集所占的数据比例,此处为30%
#建立模型
clf=tree.DecisionTreeClassifier(criterion="entropy",min_sample_=5)
clf=clf.fit(Xtrain,Ytrain) #训练模型
score=clf.score(Xtest,Ytest) #测试模型
#画出一棵树
import graphviz #导入画图的库
dot_data=tree.export_graphviz(clf,filled=True,rounded=True)
#查看特征重要性
clf.feature_importances_
[*zip(feature_name,clf.feature_importances_)]
2.random_state&splitter
减枝参数
2)min_samples_leaf & min_samples_split
3)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.show
#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtset)
#predict返回测试样本的分类回归结果
clf.predict(Xtest)
随机森林建模流程
from sklearn.tree import RandomForestClassifier
rfc=RandomForestClassifier()
rfc=rfc.fit(Xtrain,Ytrain)
score=rfc.score(Xtest,Ytest)
class sklearn.ensemble.RandomForestClassifier (n_estimators=’10’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
重要参数
参数 | 含义 |
criterion | 不纯度的两种指标:基尼系数与信息熵 |
max_depth | 树的最大深度,超过最大深度的部分会被剪掉 |
min_samples_leaf |
一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样
本,否则分枝就不会发生
|
min_samples_split |
一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分 枝,否则分枝就不会发生
|
max_features |
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,
默认值为总特征个数开平方取整
|
min_impurity_decrease | 限制信息增益的大小,小于设定值的分枝不会发生 |
n_estimators | 限制随机森林中树的个数 |
建立一片森林:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_c)
,"Random Forest:{}".format(score_r)
)
随机森林是一种经典的Bagging集成算法,其中基评估器为决策树或回归树,随机森林中的重要属性与接口与上述的决策树大致相同