赵走x博客
网站访问量:151913
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
资源编号:75871
人工智能
深入浅出Python机器学习
热度:81
在看完上面的内容之后,我们和大家一起动手,用K 最近邻算法帮助小C 对酒的分类进行建模。这里建议读者一定要跟着书本的内容自己把代码敲一遍,这样可以对Python 中几个用于机器学习的功能库有更加直观的体会。
在看完上面的内容之后,我们和大家一起动手,用K 最近邻算法帮助小C 对酒的分类进行建模。这里建议读者一定要跟着书本的内容自己把代码敲一遍,这样可以对Python 中几个用于机器学习的功能库有更加直观的体会。 # 1、对数据集进行分析 在本节中,我们将使用scikit-leam 内置的酒数据集来进行实验,这个数据集也包含在scikit-leam 的datasets 模块当中。下面我们在Jupyter Notebook 中新建一个Python 3 的记事本,从头开始完成这个小项目。 首先,我们要把酒的数据集载入项目中,在Jupyter Notebook 中输入代码如下: ``` from sklearn . datasets import load_wine # 从sklearn 的datasets 模块载入数据集 wine_dataset = load_wine() ``` 现在读者朋友可能会比较好奇这个酒数据集中的数据都包含些什么。实际上,使用load_wine 函数载入的酒数据集,是一种Bunch 对象, 它包括键( keys )和数值( v alues ) ,下面我们来检查一下酒数据集都有哪些键, 在Jupyter Notebook 中输入代码如下: ``` # 打印酒数据集中的键 print("红酒数据集中的键:\n{}".format(wine_dataset.keys())) ``` 代码运行结果: ``` 红酒数据集中的键: dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names']) ``` {结果分析}从结果中我们可以看出,酒数据集中包括数据“ data ” ,目标分类“ target ”,目标分类名称“ target_nam es ”,数据描述“ DECR ” ,以及特征变量的名称“ features_names ’ 。 那么这个数据集中究竟有多少样本( samples ),又有多少变量( features )呢?可以使用.shape 语句来让Python 告诉我们数据的大概轮廓,在Jupyter Notebook 中输入代码如下: ``` # 使用.shape来打印数据的概况 print('数据概况:{}'.format(wine_dataset['data'].shape)) ``` 运行结果: ``` 数据概况:(178, 13) ``` [结果分析] 从中我们可以看出,酒数据集中共有178 个样本,每条数据有13 个特征变量。 更细节的信息,我们可以通过打印DESCR 键来获得,下面我们输入代码如下: ``` # 打印酒的数据集中的简短描述 print(wine_dataset['DESCR']) ``` 运行代码,我们将会看到一段很长的描述: ``` .. _wine_dataset: Wine recognition dataset ------------------------ **Data Set Characteristics:** :Number of Instances: 178 (50 in each of three classes) :Number of Attributes: 13 numeric, predictive attributes and the class :Attribute Information: - Alcohol - Malic acid - Ash - Alcalinity of ash - Magnesium - Total phenols - Flavanoids - Nonflavanoid phenols - Proanthocyanins - Color intensity - Hue - OD280/OD315 of diluted wines - Proline - class: - class_0 - class_1 - class_2 :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) :Creator: R.A. Fisher :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) :Date: July, 1988 This is a copy of UCI ML Wine recognition datasets. https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data The data is the results of a chemical analysis of wines grown in the same region in Italy by three different cultivators. There are thirteen different measurements taken for different constituents found in the three types of wine. Original Owners: Forina, M. et al, PARVUS - An Extendible Package for Data Exploration, Classification and Correlation. Institute of Pharmaceutical and Food Analysis and Technologies, Via Brigata Salerno, 16147 Genoa, Italy. Citation: Lichman, M. (2013). UCI Machine Learning Repository [https://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science. .. topic:: References (1) S. Aeberhard, D. Coomans and O. de Vel, Comparison of Classifiers in High Dimensional Settings, Tech. Rep. no. 92-02, (1992), Dept. of Computer Science and Dept. of Mathematics and Statistics, James Cook University of North Queensland. (Also submitted to Technometrics). The data was used with many others for comparing various classifiers. The classes are separable, though only RDA has achieved 100% correct classification. (RDA : 100%, QDA 99.4%, LDA 98.9%, 1NN 96.1% (z-transformed data)) (All results using the leave-one-out technique) (2) S. Aeberhard, D. Coomans and O. de Vel, "THE CLASSIFICATION PERFORMANCE OF RDA" Tech. Rep. no. 92-01, (1992), Dept. of Computer Science and Dept. of Mathematics and Statistics, James Cook University of North Queensland. (Also submitted to Journal of Chemometrics). ``` {结果分析]从结果中我们可以看出,酒数据集中的178 个样本被归入3 个类别中,分别是class 0, clas1l 和class 2 ,其中class 0 中包含59 个样本, class l1中包含71 个样本,class 2 中包含48 个样本。而从1 )至13 )分别是13 个特征变量,包括酒精含量、苹果酸、镇含量、青花素含量、色彩饱和度等。我们先不用管每一个变量具体的含义,接下来先对数据进行一些处理。 # 2、 生成训练、数据集和测试数据集 在我们创建一个能够自动将酒进行分类的机器学习的算法模型之前,先要能够对模型的可信度进行评判,否则我们无法知道它对于新的酒所进行的分类是否准确。那么问题来了,如果我们用生成模型的数据去评估算法模型,那得分肯定是满分,这就好像我们按照一个体重75kg 的人的身材数据缝制了一件衣服,那么这件衣服对于这个人肯定是百分之一百合身的,但如果换了一个体重85kg 的人,这件衣服就不一定合适了。 所以我们现在要做的工作是,把数据集分为两个部分: 一部分称为训练数据集;另一部分称为测试数据集。训练数据集就好比我们缝制衣服时所用到的模特的身材,而测试数据集则是用来测试这件衣服,对于别人来说究竟有多合身的模特。 在scikit-learn中, 有一个train_test_split 函数,它是用来帮助用户把数据集拆分的工具。 其工作原理是: train_test_split 函数将数据集进行随机排列, 在默认情况下将其中75 % 的数据及所对应的标签划归到训练数据集, 并将其余25% 的数据和所对应的标签划归到测试数据集。 >⚠️: 我们一般用大写的X 表示数据的特征,而用小写的y 表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y 是一个一维数组,或者说是一个向量。 接下来,我们使用train_test_split 函数将酒的数据集中的数据分为训练数据集和测试数据集。在Jupyter Notebook 中输入代码如下: ``` # 导人数据集拆分工具 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) ``` 此时,我们已经对酒数据集完成了拆分。在上述代码中,我们看到了一个参数称为random_ state ,并且我们将它指定为0 。这是因为train_ test_ split 函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同, 方法就是通过固定random state 参数的数值,相同的random_state 参数会一直生成同样的伪随机数,但当这个值我们设为0 , 或者保持缺省的时候,则每次生成的伪随机数均不同。 下面我们看一看train_test_ split 函数拆分后的数据集大概是什么情况, 在Jupyter Notebook 中输入代码如下: ``` # 打印训练数据集中特征向量的形态 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,) ``` [结果分析]此刻我们可以看到在训练数据集中,样本X 数量和其对应的标签y 数量均为133 个,约占样本总量的74.7% ,而测试数据集中的样本X 数量和标签y 数量均为45 个,约占样本总数的25.3 % 。同时,不论是在训练数据集中,还是在测试数据集中,特征变量都是13 个。 # 3、使用K最近邻算法进行建模 在获得训练数据集和测试数据集之后,就可以机器学习的算法进行建模了。scikit-learn中整合了众多的分类算法,究竟应该使用哪一种呢? 这里选择了K 最近邻算法,因为我们在接下来的一章当中会详细介绍K 最近邻算法,所以提前给读者们展示一下它的用法。 K 最近邻算法根据训练数据集进行建模, 在训练数据集中寻找和新输入的数据最近的数据点, 然后把这个数据点的标签分配给新的数据点,以此对新的样本进行分类。现在我们在Jupyter Notebook 中输入代码如下: ``` from sklearn.neighbors import KNeighborsClassifier # 指定模型的n_neighbors参数值为1 knn = KNeighborsClassifier(n_neighbors=1) ``` 到这里读者可能会发现,我们给KNeighborsC!assifier 指定了一个参数, n_neighbors=1 。正如我们在前文中所说,在scikit-learn 中,机器学习模块都是在其固定的类中运行的,而K 最近邻分类算法是在neighbors 模块中的KNeighborsClassifier 类中运行。而我们从一个类中创建对象的时候,就需要给模型指定一个参数。对于KNeighborsClassifier 类来说,最关键的参数就是近邻的数量, 也就是n_neighbors 。而knn 则是我们在KNeighborsC!assifier类中创建的一个对象。 接下来我们要使用这个叫作knn 的对象中称为“拟合(fit)”的方法来进行建模,建模的依据就是训练数据集中的样本数据X_train 和其对应的标签y_train,所以我们输入代码如下: ``` # 用模型对数据进行拟合 knn.fit(X_train, y_train) print(knn) ``` 运行结果: ``` KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=1, p=2, weights='uniform') ``` [结果分析] 从中我们可以看到knn 的拟合方法把自身作为结果返回给了我们。从结果中我们能够看到模型全部的参数设定,当然了,除了我们指定的n_neighbors= 1 之外,其余参数都保持默认值即可。 # 4、 使用模型对新样本的分类进行预测 现在我们可以使用刚刚建好的模型对新的样本分类进行预测了,不过在这之前,可以先用测试数据集对模型进行打分,这就是我们创建测试数据集的目的。测试数据集并不参与建模,但是我们可以用模型对测试数据集进行分类,然后和测试数据集中的样本实际分类进行对比,看吻合度有多高。吻合度越高,模型的得分越高,说明模型的预测越准确,满分是1.0 。 下面开始评分,在Jupyt er Notebook 中输入代码如下: ``` # 打印模型的得分 print("测试数据集得分{:.2f}".format(knn.score(X_test,y_test))) ``` 结果: ``` 测试数据集得分0.76 ``` [结果分析] 我们看到, 这个模型在预测测试数据集的样本分类上得分并不高,只有0 . 76 ,也就是说, 模型对于新的样本数据做出正确分类预测的概率是76% 。这个结果确实差强人意, 不过我们只是用来演示K 最近邻算法,所以可以先不用太纠结分数的问题。 下面假设我们得到了一瓶新的酒, 它的特征变量值经测定如表所列。  现在我们用建好的模型对新酒做出分类预测,在Jupyter Notebook 中输入代码如下: ``` 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]]) # 使用. predict进行预测 prediction= knn .predict( X_new ) print('预测新红酒的分类为{}'.format(wine_dataset['target_names'][prediction])) ``` 代码运行结果: ``` 预测新红酒的分类为['class_2'] ``` [结果分析] 模型把新酒的分类预测为class_2,虽然准确率只有7 6% ,但对于我们的第一个机器学习的实战项目来说,还是相当不锚的。 # 小结 在本章中,我们介绍了K 最近邻算法的原理和它的使用方法,包括K 最近邻分类和K 最近邻回归,并且使用K 最近邻算法帮助小C 对酒的分类进行了分析。不过我们也看到,对于这个13 维的数据集来说, K 最近邻算法的表现,并不能用优异来形容。这也确实是K 最近邻算法的一大软肋。 K 最近邻算法可以说是一个非常经典而且原理十分容易理解的算法,作为第一个算法来进行学习是可以帮助大家在未来能够更好地理解其他的算法模型。不过K 最近邻算法在实际使用当中会有很多问题,例如它需要对数据集认真地进行预处理、对规模超大的数据集拟合的时间较长、对高维数据集拟合欠佳,以及对于稀疏数据集束手无策等。 所以在当前的各种常见的应用场景中, K 最近邻算法的使用并不多见。 接下来,我们会开始学习同样经典,而且在高维数据集中表现良好的算法一一广义线性模型。