sklearn 学习笔记-1

一、简单介绍

sklearn库是Python中自带的开源机器学习库,全称scikit-learn。 基于NumpySciPyMatplotlib等数值计算库实现高效应用, 包括了大部分主流的机器学习算法。

官网链接: [scikit-learn](scikit-learn: machine learning in Python — scikit-learn 1.3.0 documentation)

当然在此之前最好弄清楚机器学习和深度学习的区别,sklearn并不是做深度学习的。

sklearn的基本模块介绍(来自官网+个人翻译):

分类Classification:识别某个对象属于哪个类别。常见的应用有:垃圾邮件识别、图像识别。

回归Regression:预测与对象相关联的连续值属性。常见的应用有:药物反应,预测股价。

聚类Clustering:将相似对象自动分组。常见的应用有:客户细分,分组实验结果。

降维Dimensionality reduction:减少要考虑的随机变量的数量。常见的应用有:可视化,提高效率。

模型选择Model selection:比较,验证,选择参数和模型。它的目标是通过参数调整提高精度。

预处理Preprocessing:特征提取和归一化。 常见的应用有:把输入数据(如文本)转换为机器学习算法可用的数据。

二、安装过程

因为我有Anaconda 所以直接输入指令

1
conda install scikit-learn

pip有的时候还是太烂了

三、鸢尾花Iris数据集测试

介绍

鸢尾花数据集irissklearn里自带的一个数据集之一,存储在sklearn.datasets里,调用方式非常简单如下

1
2
3
#读入iris数据集
from sklearn import datasets
iris = datasets.load_iris()

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。

选自"百度百科–IRIS"

综上所述,iris基本上是根据花的不同特征进行了一些记录和汇总,我们可以利用以下代码输出feature_namestarget_names

1
2
3
#输出对应的鸢尾花特征名称和种类名称
print(iris.feature_names) #特征名称
print(iris.target_names) #种类名称

结果如下:

1
2
3
4
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
#鸢尾花特征分别为:花萼长度、花萼宽度、花瓣长度、花瓣宽度
['setosa' 'versicolor' 'virginica']
#鸢尾花目标类别为:山鸢尾、杂色鸢尾、维吉尼亚鸢尾

输出iris的数据集大小

1
2
3
#输出iris数据集大小
print(iris.data.shape) #特征数据集大小
print(iris.target.shape) #目标数据集大小

结果如下:

1
2
3
4
(150, 4)
(150,)
#data:150行对应每种花, 4列对应4个特征
#target: 150行对应每种花的种类

可通过以下html代码直观展示iris数据集

1
<iframe src=http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data width=300 height=200></iframe>

iris数据集的图像化表示

1
2
3
4
5
6
7
8
9
10
11
12
13
#iris 直观2d图表示
#存储特征矩阵 X
X = iris.data
#存储目标向量 y
y = iris.target
#引入画图的matplotlib库
import matplotlib.pyplot as plt
X_sepal = X[:, :2] #选择前两种特征,花萼长度、花萼宽度
plt.scatter(X_sepal[:, 0], X_sepal[:, 1], c = y) #绘制散点图
#参数(横坐标值, 纵坐标值, 散点对应颜色)
plt.xlabel("Sepal length") #横坐标花萼长度
plt.ylabel("Sepal width") #纵坐标花萼宽度
plt.show()

结果

Figure_1

测试KNN分类器

Examples:

这里采用了官网的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#在iris上跑KNN算法
#代码来源于https://scikit-learn.org/stable/auto_examples/neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py

#引入绘图相关的库
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap

#引入sklearn算法库,数据集,可视化库
from sklearn import datasets, neighbors
from sklearn.inspection import DecisionBoundaryDisplay

#KNN算法中的 K = 15
n_neighbors = 15

#引入iris数据库
iris = datasets.load_iris()

#引入花萼特征,也就是前两个特征
#原数据集切片, 现成为(150,2)大小的新数据集, 记为X
#y 是对应目标数据
X = iris.data[:, :2]
y = iris.target

#创建Colormap
#cmap_light 对应每种花对应区域的背景颜色
#cmap_bold 对应每种花的实心散点颜色
cmap_light = ListedColormap(["orange", "cyan", "cornflowerblue"])
cmap_bold = ["darkorange", "c", "darkblue"]


#uniform, distance 均为 KNeighborsClassifier参数
#weights = uniform 时 KNN算法不考虑距离的影响
#weights = distance 时 KNN算法考虑距离的影响

#weights = distance 时, 可以自行定义闵可夫斯基距离, 参数为[p=]
#如曼哈顿距离(p=1), 欧氏距离(p=2) 等价于p范数的计算公式
#使用例子 neighbors.KNeighborsClassifier(n_neighbors, weights="distance", p=2)
for weights in ["uniform", "distance"]:
#创建一个KNN分类器实例
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
#输入数据集和目标集,开始分类
clf.fit(X, y)

_, ax = plt.subplots()
#绘制区域的背景部分
DecisionBoundaryDisplay.from_estimator(
clf,
X,
cmap=cmap_light,
ax=ax,
response_method="predict",
plot_method="pcolormesh",
xlabel=iris.feature_names[0],
ylabel=iris.feature_names[1],
shading="auto",
)

#绘制数据集的散点
sns.scatterplot(
x=X[:, 0],
y=X[:, 1],
hue=iris.target_names[y],
palette=cmap_bold,
alpha=1.0,
edgecolor="black",
)
#图片标题
plt.title(
"3-Class classification (k = %i, weights = '%s')" % (n_neighbors, weights)
)
#输出
plt.show()

输出结果:

感觉多少有点不准

注:p范数

XYp=(Σi=1nxiyip)1p||X-Y||_{p} = (\Sigma_{i=1}^{n} |x_i-y_i|^{p})^{\frac1p}

四、wine葡萄酒数据集

介绍

葡萄酒识别数据集(Wine Recognition dataset)通常用于多类别分类问题建模。数据集包括从三个不同的品种(类别)的葡萄酒中测得的13种不同的化学特征,共178个样本。这些化学特征包括酸度、灰分、酒精浓度等。

img

img

测试KNN分类器

iris分类的基础上略微改动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#引入绘图相关的库
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap

#引入sklearn算法库,数据集,可视化库
from sklearn import datasets, neighbors
from sklearn.inspection import DecisionBoundaryDisplay

#KNN算法中的 K = 15
n_neighbors = 15

#引入wine数据库
wine = datasets.load_wine()

#引入前两个特征, 酒精和酸度
#原数据集切片,记为X
#y 是对应目标数据
X = wine.data[:, :2]
y = wine.target

#创建Colormap
#cmap_light 对应每种酒对应区域的背景颜色
#cmap_bold 对应每种酒的实心散点颜色
cmap_light = ListedColormap(["orange", "cyan", "cornflowerblue"])
cmap_bold = ["darkorange", "c", "darkblue"]


#uniform, distance 均为 KNeighborsClassifier参数
#weights = uniform 时 KNN算法不考虑距离的影响
#weights = distance 时 KNN算法考虑距离的影响

#weights = distance 时, 可以自行定义闵可夫斯基距离, 参数为[p=]
#如曼哈顿距离(p=1), 欧氏距离(p=2) 等价于p范数的计算公式
#使用例子 neighbors.KNeighborsClassifier(n_neighbors, weights="distance", p=2)
for weights in ["uniform", "distance"]:
#创建一个KNN分类器实例
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
#输入数据集和目标集,开始分类
clf.fit(X, y)

_, ax = plt.subplots()
#绘制区域的背景部分
DecisionBoundaryDisplay.from_estimator(
clf,
X,
cmap=cmap_light,
ax=ax,
response_method="predict",
plot_method="pcolormesh",
xlabel=wine.feature_names[0],
ylabel=wine.feature_names[1],
shading="auto",
)

#绘制数据集的散点
sns.scatterplot(
x=X[:, 0],
y=X[:, 1],
hue=wine.target_names[y],
palette=cmap_bold,
alpha=1.0,
edgecolor="black",
)
#图片标题
plt.title(
"3-Class classification (k = %i, weights = '%s')" % (n_neighbors, weights)
)
#输出
plt.show()

结果如下:

wine_Figure_1

wine_Figure_2

感觉还是不太行

五、评价

  1. sklearn在小数据集toy datasets上起到一个实验的价值,可实际上过于小的数据集没有分析的价值,下一步要考虑在更大的数据集上做分类
  2. 现在的调参手段还不足,需要网格调参并且对不同参数的结果有明确的评价指标
  3. 其他