3.3 kNN实战 - 酒的分类
其实这部分也没啥.. 和前面大同小异. 主要的差异就是, 继续学习使用sklearn的datasets
模块读取已有的数据集.
3.3.1 数据集基本分析
#从sklearn的datasets模块载入数据集
from sklearn.datasets import load_wine
wine_dataset = load_wine()
print("红酒数据集中的键:\n{}".format(wine_dataset.keys()))
# 红酒数据集中的键:
# dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
print('数据概况:{}'.format(wine_dataset['data'].shape))
# 数据概况:(178, 13)
print(wine_dataset['DESCR'])
# .. _wine_dataset:
# Wine recognition dataset
# ------------------------
# **Data Set Characteristics:**
# 后面接了一堆的说明. 只放出有意义的部分
:Summary Statistics:
============================= ==== ===== ======= =====
Min Max Mean SD
============================= ==== ===== ======= =====
Alcohol: 11.0 14.8 13.0 0.8
Malic Acid: 0.74 5.80 2.34 1.12
Ash: 1.36 3.23 2.36 0.27
Alcalinity of Ash: 10.6 30.0 19.5 3.3
Magnesium: 70.0 162.0 99.7 14.3
Total Phenols: 0.98 3.88 2.29 0.63
Flavanoids: 0.34 5.08 2.03 1.00
Nonflavanoid Phenols: 0.13 0.66 0.36 0.12
Proanthocyanins: 0.41 3.58 1.59 0.57
Colour Intensity: 1.3 13.0 5.1 2.3
Hue: 0.48 1.71 0.96 0.23
OD280/OD315 of diluted wines: 1.27 4.00 2.61 0.71
Proline: 278 1680 746 315
============================= ==== ===== ======= =====
:Missing Attribute Values: None
:Class Distribution: class_0 (59), class_1 (71), class_2 (48)
使用 load_xxxx
的方法就可以简单地加载该数据集, 其实数据集是一种Bunch
对象, 用于数据集的一种容器, 类似于字典, 有key和value. 可使用对象.key
来将键名作为属性来调用. 属性有: 'DESCR', 'data', 'feature_names', 'target', 'target_names', 部分数据集还有如'filename'等.
-
DESCR
是数据集的描述. 一个字符串. 这里可以看到, 每个类有多少样本. -
data
这里是一个(178,13)
的ndarray
, 类似地target
是(178,1)
的数组. -
feature_names
和target_names
,前者储存了13个feature的名字, 后者储存了对于目标0,1,2类(没有名, Iris集会有花种类名) .
此外, datasets
模块还有不少小数据集:
除此以外, 还能简单地获取更大的一些数据集:
datasets使用fetch获取的数据集
3.3.2 生成训练数据集和测试数据集
使用model_selection
模块的train_test_split
方法可以将数据集随机分成一定大小的子集. 从而实现训练和测试两步. 前面已经说了, 一般使用大写X来储存多维数据的训练集, 而用小写y储存一位数组(向量).
-
train_test_split
方法是个重要方法, 将数组分为随机的训练集和测试集. 须确保数据长度一致.-
*arrays
: 等长的可索引化的序列. list, array, scipy-sparse矩阵, pandas dataframe都可以. -
test_size=None
: 浮点0-1的话,是测试集的比例; 整数的话是测试集的样品数. 如果None, 根据训练集来定, 如果训练集也是None, 则默认设为0.25. -
train_size=None
: 训练集大小或比例, 同上. None的话根据测试集来互补. -
random_state=None
: 随机状态,int
,RandomState
. 对于随机种子想固定时有用. -
shuffle=True
: 在分割数据集前进行洗牌(打乱顺序) . -
stratify=None
: 分层??? - 返回 list(array), 长度为
2*arrays
总数 (给定两个数组(特征和目标值), 会分成4份, 依次是输入数组分成的训练集和测试集,顺序很重要). 例如输入X,y
,返回train_X, test_X, train_y, test_y
.
-
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(wine_dataset['data'],
wine_dataset['target'], random_state=0)
print('X_train shape:{}'.format(X_train.shape))
print('X_test shape:{}'.format(X_test.shape))
print('y_train shape:{}'.format(y_train.shape))
print('y_test shape:{}'.format(y_test.shape))
# X_train shape:(133, 13)
# X_test shape:(45, 13)
# y_train shape:(133,)
# y_test shape:(45,)
3.3.3 kNN进行建模和预测
和前面类似, 包括了使用fit
来拟合(使用训练集X_train, y_train
), 使用predict
来预测(使用测试集X_test, y_test), 使用score
也可以预测并直接评分.
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 1)
knn.fit(X_train, y_train)
print('训练数据集得分:{:.2f}'.format(knn.score(X_train, y_train)))
# 训练数据集得分:1.00
print('测试数据集得分:{:.2f}'.format(knn.score(X_test, y_test)))
# 测试数据集得分:0.76
这里的得分其实是预测正确样本数/总输入样本数
.
假设有一瓶新酒, 经测试各种指标后(如酒精含量,某某成分含量等), 可以建立其特征. 利用新特征, 就可以对其进行分类预测:
import numpy as np
X_new = np.array([[13.2,2.77,2.51,18.5,96.6,1.04,2.55,0.57,1.47,6.2,1.05,
3.33,820]])
prediction = knn.predict(X_new)
print("预测新红酒的分类为:{}".format(wine_dataset['target_names'][prediction]))
# 预测新红酒的分类为:['class_2']
网友评论