python-scikit learn学习(1)

0x00 scikit-learn

Scikit-learn(以前称为scikits.learn)是一个用于Python编程语言的免费开源机器学习库。它广泛地支持各种分类、聚类以及回归分析方法比如支持向量机、随机森林、DBSCAN等等,由于其强大的功能、优异的拓展性以及易用性,目前受到了很多数据科学从业者的欢迎,也是业界相当著名的一个开源项目之一。

0x01 scikit-learn安装

scikit-learn安装和别的python安装没有多少不同,不过安装scikit-learn之前要先安装新版本的numpy和scipy库。

1
2
3
pip install numpy
pip install scipy
pip install scikit-learn

0x02 scikit-learn数据集

scikit-learn库中有一些标准数据集。在scikit-learn官网的数据库中有大量的数据集,可以直接拿来使用。

官方数据集: http://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets

其中Loaders都是现实中一些整理好的数据,可以直接使用。

Samples generator中是一些用户可以通过输入参数来控制随机生成的数据。

使用时我们要先导入sklearn.datasets库,如:

1
2
3
4
5
from sklearn import datasets
iris = datasets.load_iris() #鸢尾花数据集
print(iris)
digits = datasets.load_digits() #数字数据集
print(digits)
  • 一个数据集是一个包含数据所有元素的类字典对象,这个数据存在‘.data’成员变量中,是一个n*n数组行表示样例,列表示特征。
  • 在监督学习中,一个或多个标签Y存储在‘.target’成员变量中。

从如下代码运行结果就能看出这几部分数据:

1
2
3
4
5
from sklearn import datasets
digits = datasets.load_digits() #数字数据集
print(digits.data)
print(digits.target)
print(digits.images[0])

0x03 scikit-learn学习方法选择

在学习和预测之前,我们要根据我们的数字数据集以及要达成的目标选择合适的机器学习方法,scikit-learn官网有一张图清晰的给出了如何去选择正确的方法:

官方网站提供的原图地址: http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

我介绍一下具体步骤:

  • 这张图从start部分开始读,如果数据少于50,就去获取更多数据,如果数据大于50,就进入下一步。

  • 然后根据是否预测类别、有无标签、是否预测数量等判断分别属于分类问题、聚类问题、回归问题和降维问题四种中的哪一种。

  • 再根据数据量、数据类型等来分别选择合适的机器学习算法。

在选择好方法之后,从scikit-learn库导入对应的方法,然后根据官方提供的使用方法进行调用和参数的选用,就可以进行学习。

0x04 scikit-learn学习与预测(分类问题)

在这里以鸢尾花数据集的学习和预测为例,讲解一下通用的scikit-learn学习与预测步骤,先贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target
#print(iris_y)

x_trian,x_test,y_train,y_test = train_test_split(iris_x,iris_y,test_size=0.25)

#print(y_train)

knn = KNeighborsClassifier()
knn.fit(x_trian,y_train)
y_predict = knn.predict(x_test)

print(y_predict)
pritn(y_test)
  • 上面的代码从sklearn的数据库导入了鸢尾花数据集,然后将data作为特征,target作为标签。
  • 然后通过train_test_split方法将特征和标签分成训练集和测试集并打乱顺序,其中test_size控制测试集占比0.25。
  • 然后使用KNeighborsClassifier机器学习方法,学习训练集,并用训练好的模型预测测试集中x_test对应的分类结果。
  • 最后将预测的分类结果y_predict与原始数据中的分类结果y_test输出后对比

从最终输出结果可以看到,基本都预测成功了,如果我们样本量更大一点,或许会找到一些错误预测结果。

0x05 scikit-learn学习与预测(回归问题)

再使用datasets中提供的自动生成数据的方法来预测一个回归问题。同样先贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt


example_x,example_y = datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=3)

plt.scatter(example_x,example_y)
plt.show()

lr = LinearRegression()
lr.fit(example_x,example_y)

print(lr.predict(example_x[:5,:]))
print(example_y[:5])
  • 上面代码中,首先使用make_regression生成随机的回归数据,其中n_samples代表数据数量,n_features代表特征数量,n_targets代表特征数量,noise代表噪声大小
  • 然后使用matplotlib模块将生成的二维数据绘制出来
  • 接着使用LinearRegression机器学习方法,学习训练集,并用训练好的模型预测样本中前五个数据
  • 最后将预测结果与原始数据的标签值输出进行对比

从二维图形可以看出生成数据的分布。

从输出结果可以看出,预测结果基本符合,但是有一定的误差。