scikit-learn 机器学习介绍

一、机器学习问题

scikit-learn 是一个比较流行的开源机器学习库。它支持许多分类,回归,聚类算法,包括支持向量机,逻辑回归,朴素贝叶斯,随机森林,梯度boosting,k-means 和 DBSCAN,并且可以与 Numpy 与 SciPy 库进行交互。

二、加载示例数据集

鸢尾花卉数据集

安德森鸢尾花卉数据集是一类多重变量分析的数据集,其数据集包含了150个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。四个特征被用作样本的定量分析,它们分别是花萼和花瓣的长度和宽度。

from sklearn import datasets
iris = datasets.load_iris()

#数据存储在 .data 成员中,它是一个 (n_samples, n_features) numpy 数组
iris.data.shape
=>(150, 4)

#一个样本的类别存储在 .target 属性中,它是一个一维数组
iris.target.shape
=>(150,)

#显示数据集中有哪些类别
import numpy as np
np.unique(iris.target)
=>
array([0, 1, 2])        #共三类,分别用 0,1,2 表示

手写数字数据集

手写数字数据集包含了来自 44 个作者的 250 个样本,通常被用作手写数字预测。

#加载数据集
digits = datasets.load_digits()

#查看底层数据
print(digits.data)

#查看数据集目标值
digits.target

三、学习与预测

以使用手写数字数据集做数字识别为例, 需要将评估函数与数据进行拟合来进行预测。在 scikit-learn 中,评估函数(estimator)是一个 Python 对象,它实现了 fit(X, y)predict(T) 方法。

#类 sklearn.svm.SVC 就是一个实现了支持向量分类的评估函数
from sklearn import svm
clf = svm.SVC(gamma=0.001, C=100.)                         #关于模型参数的选择,这里手动设置 gamma 的值,使用格点搜索与交叉验证的方法可以自动帮我们找到较好的参数。

#评估函数实例的变量名取作 clf ,说明它是一个分类器(classifier)。将训练集传递给 fit 方法进行数据拟合之后就可以做预测了。这里取数据集的最后一张图作为预测图,前面的数据都作为训练数据。

clf.fit(digits.data[:-1], digits.target[:-1]) 
=>
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
  gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
  random_state=None, shrinking=True, tol=0.001, verbose=False)
#预测
clf.predict(digits.data[-1])
=>
array([8])

四、回归

在回归的模型中,目标值是输入值的线性组合:
《scikit-learn 机器学习介绍》

其中 w = (w_1,…, w_p) 作为 coef_(因数),w_0 作为 intercept_(截距)。线性回归拟合一个线性模型,根据最小二乘法最小化样本与模型的残差。

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
clf.coef_               #权重
=>array([ 0.5,  0.5])
clf.intercept           #截距,近似为0
=>1.1102230246251565e-16

五、分类

最简单的分类算法就是knn算法:给一个新的数据,取在n维空间中离它最近的样本的标签作为它的标签,这里的 n 由样本的特征数量决定。
knn分类器(k-nearest neighbors)示例:

from sklearn import neighbors
knn = neighbors.KNeighborsClassifier()
knn.fit(iris.data, iris.target) 
knn.predict([[0.1, 0.2, 0.3, 0.4]])        #四维特征
=>array([0])

六、聚类

最简单的聚类算法是 k-means 算法,它将数据分成 k 类,将一个样本分配到一个类中时,分配依据是该样本与所分配类中已有样本的均值(可以想象该类中已分配样本的质心的位置)的距离。同时因为新加入了一个样本,均值也会更新(质心的位置发生变化)。这类操作会持续几轮直至类收敛,持续的轮数由 max_iter 决定。

from sklearn import cluster, datasets
iris = datasets.load_iris()
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(iris.data) 
=>
KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10,
    n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,
    verbose=0)

#分别抽取打印 k-means 的分类结果与数据的实际结果
print k_means.labels_[::10]
=> [1 1 1 1 1 0 0 0 0 0 2 2 2 2 2]

print iris.target[::10]                #数据太少,无监督学习不佳
=> [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]

图像压缩

聚类的一个典型应用就是对图片进行色调分离

from scipy import misc
face = misc.face().astype(np.float32)
X = face.reshape((-1, 1)) # We need an (n_sample, n_feature) array
k_means = cluster.KMeans(n_clusters=5)
k_means.fit(X) 
values = k_means.cluster_centers_.squeeze()
labels = k_means.labels_
face_compressed = np.choose(labels, values)
face_compressed.shape = face.shape

七、降维

当样本集的某一个特征几乎可以由其他特征计算得到,则可以进行数据降维。降维除了可以用在数据可视化上,还可以通过对数据进行预处理提高监督学习处理数据的效率。

#主成分分析
from sklearn import decomposition
pca = decomposition.PCA(n_components=2)
pca.fit(iris.data)
=>
PCA(copy=True, n_components=2, whiten=False)

#数据可视化
import pylab as pl
X = pca.transform(iris.data)
pl.scatter(X[:, 0], X[:, 1], c=iris.target) 
pl.show()

《scikit-learn 机器学习介绍》

点赞