MachineLearning-教你⽤Scikit-Learn来做分类器(完整版)机器学习系列专栏
选⾃ Python-Machine-Learning-Book On GitHub
作者:Sebastian Raschka
翻译&整理 By Sam
这篇《教你⽤Scikit-Learn来做分类器》对于我们⼊门scikit learn有很好的参考价值,之前分了三篇来分别阐述,相对篇幅会⼩⼀点,这篇的话就是把先前的全部内容进⾏汇总,所以篇幅看起来会相对吓⼈,⼤家可以收藏起来慢慢研究,给⾃⼰充电哦?!
由于⽂章篇幅较长,还是先把本⽂的结构贴在前⾯,如下:
Scikit-Learn初认识
使⽤Scikit-Learn训练感知器
使⽤逻辑回归构建⼀个概率类的分类模型
逻辑回归的激活函数
逻辑回归的损失函数
使⽤sklearn训练⼀个逻辑回归模型
使⽤正则化处理过拟合
使⽤Kernel-SVM来解决⾮线性问题
什么是⾮线性问题
核⽅法函数及原理
利⽤核技巧Kernel-SVM在⾼维空间中寻分隔超平⾯
机器学习决策树模型
最⼤化信息增益-获得最⼤的提升度
建⽴决策树
通过随机森林将“弱者”与“强者”模型集成
K近邻分类模型(⼀个懒惰的算法)
参考⽂献
PS:代码已单独保存:可在后台输⼊“sklearn”进⾏获取ipynb⽂件
Scikit-Learn初认识
关于Scikit的介绍,⼤家应该看过很多了,简答来说它就是⽤Python开发的机器学习库,其中包含⼤量机器学习算法、数据集,是数据挖掘⽅便的⼯具,更多的介绍这⾥就不说了,⼤家有兴趣可以去百度⼀下呗。
我们直接从scikit-learn⾥加载iris数据集。在这⾥,第三列表⽰花瓣长度,第四列表⽰花瓣宽度。这些类已经转换为整数标签,其中0=Iris-Setosa, 1=Iris-Versicolor, 2=Iris-Virginica。
使⽤Scikit-Learn训练感知器
导⼊数据集:
1# 导⼊sklearn⾥⾯的iris数据集,并且获取特征和⽬标列2from sklearn import datasets
3import numpy as np
4iris = datasets.load_iris()
5X = iris.data[:, [2, 3]]
6y = iris.target
划分数据集:
1# 根据sklearn的版本使⽤不同的类
2if Version(sklearn_version) < '0.18':
3    ss_validation import train_test_split 4else:
5    del_selection import train_test_split 6X_train, X_test, y_train, y_test = train_test_split(
7    X, y, test_size=0.3, random_state=0)
特征标准化:
1from sklearn.preprocessing import StandardScaler
2sc = StandardScaler()
3sc.fit(X_train)
4X_train_std = sc.transform(X_train)
5X_test_std = sc.transform(X_test)
训练模型:
1from sklearn.linear_model import Perceptron
2ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0) 3ppn.fit(X_train_std, y_train)
模型效果:
绘制分类情况:
lors import ListedColormap
2import matplotlib.pyplot as plt
3import warnings
4def versiontuple(v):
5    return tuple(map(int, (v.split("."))))
6def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
7    # setup marker generator and color map
8    markers = ('s', 'x', 'o', '^', 'v')
9    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
10    cmap = ListedColormap(colors[:len(np.unique(y))])
11    # plot the decision surface
12    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
random翻译13    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
14    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
15                          np.arange(x2_min, x2_max, resolution))
16    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
17    Z = Z.reshape(xx1.shape)
18    urf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
19    plt.xlim(xx1.min(), xx1.max())
20    plt.ylim(xx2.min(), xx2.max())
21    for idx, cl in enumerate(np.unique(y)):
22        plt.scatter(x=X[y == cl, 0],
23                    y=X[y == cl, 1],
24                    alpha=0.6,
25                    c=cmap(idx),
26                    edgecolor='black',
27                    marker=markers[idx],
28                    label=cl)
29    # highlight test samples
30    if test_idx:
31        # plot all samples
32        if not versiontuple(np.__version__) >= versiontuple('1.9.0'):
33            X_test, y_test = X[list(test_idx), :], y[list(test_idx)]
34            warnings.warn('Please update to NumPy 1.9.0 or newer')
35        else:
36            X_test, y_test = X[test_idx, :], y[test_idx]
37        plt.scatter(X_test[:, 0],
38                    X_test[:, 1],
39                    c='',
40                    alpha=1.0,
41                    edgecolor='black',
42                    linewidths=1,
43                    marker='o',
44                    s=55, label='test set')
再次训练模型并可视化:
1# 为了显⽰中⽂(这⾥是Mac的解决⽅法,其他的⼤家可以去百度⼀下)
2from matplotlib.font_manager import FontProperties
3font = FontProperties(fname='/System/Library/Fonts/')
4# vstack:纵向合并,更多具体⽤法可以百度
5# hstack:横⾏合并,更多具体⽤法可以百度
6X_combined_std = np.vstack((X_train_std, X_test_std))
7y_combined = np.hstack((y_train, y_test))
8plot_decision_regions(X=X_combined_std, y=y_combined,
9                      classifier=ppn, test_idx=range(105, 150))
10plt.xlabel('花瓣长度 [标准化后]',FontProperties=font,fontsize=14)
11plt.ylabel('花瓣宽度 [标准化后]',FontProperties=font,fontsize=14)
12plt.legend(loc='upper left')
13plt.tight_layout()
14plt.show()
output:
使⽤逻辑回归构建⼀个概率类的分类模型
逻辑回归的激活函数
关于激活函数,⾸先要搞清楚的问题是,激活函数是什么,有什么⽤?不⽤激活函数可不可以?答案是不可以。
激活函数的主要作⽤是提供⽹络的⾮线性建模能⼒。如果没有激活函数,那么该⽹络仅能够表达线性映射,此时即便有再多的隐藏层,其整个⽹络跟单层神经⽹络也是等价的。因此也可以认为,只有加⼊了激活函数之后,深度神经⽹络才具备了分层的⾮线性映射学习能⼒。
激活函数的性质:
可微性:当优化⽅法是基于梯度的时候,这个性质是必须的。
单调性:当激活函数是单调的时候,单层⽹络能够保证是凸函数。
输出值的范围:当激活函数输出值是 有限 的时候,基于梯度的优化⽅法会更加稳定,因为特征的表⽰受有限权值的影响更显著;当激活函数的输出是 ⽆限 的时候,模型的训练会更加⾼效,不过在这种情况⼩,⼀般需要更⼩的learning rate
Sigmoid 是使⽤范围最⼴的⼀类激活函数,具有指数函数形状,它在物理意义上最为接近⽣物神经元。此外,(0, 1) 的输出还可以被表⽰作概率,或⽤于输⼊的归⼀化,代表性的如Sigmoid交叉熵损失函数。(⼀般会⽤于⼆分类问题的激活函数,深度学习⼤概还有3种激活函数,⼤家可以去百度⼀下。)
图:sigmoid函数长酱紫
逻辑回归的损失函数
逻辑回归的对数似然损失函数cost function:
图:详见参考⽂献[2]
也可以直观地从图⾥看到损失函数的原理:
使⽤sklearn训练⼀个逻辑回归模型
关于逻辑回归算法,调⽤的⽅式和上⾯的ppn算法是类似,如下:
1from sklearn.linear_model import LogisticRegression
2# 导⼊逻辑回归算法包
3lr = LogisticRegression(C=1000.0, random_state=0)
4lr.fit(X_train_std, y_train)
5plot_decision_regions(X_combined_std, y_combined,
6                      classifier=lr, test_idx=range(105, 150))
7plt.xlabel('花瓣长度 [标准化后]',FontProperties=font,fontsize=14)
8plt.ylabel('花瓣宽度 [标准化后]',FontProperties=font,fontsize=14)
9plt.legend(loc='upper left')
10plt.tight_layout()
11plt.show()
output:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。