赞
踩
测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米
类别:属于setosa、versicolor 或virginica 三个品种之一
机器学习中的个体叫作样本(sample),其属性叫作特征(feature)。data 数组的形状(shape)是样本数乘以特征数。
- #调用load_iris 函数来加载数据
- from sklearn.datasets import load_iris
- iris_dataset = load_iris()# load_iris 返回的iris 对象是一个Bunch 对象,与字典非常相似,里面包含键和值
-
- #查看键值
- print("Keys of iris_dataset:\n{}".format(iris_dataset.keys()))
- #查看DESCR中数据集介绍
- print(iris_dataset['DESCR'][:193] + "\n...")
- #查看 'target_names'中花的品种
- print("target names:{}".format(iris_dataset['target_names']))
- #data类型
- print("Type of data: {}".format(type(iris_dataset['data'])))
- #data的容量
- print("Shape of data: {}".format(iris_dataset['data'].shape))
- #查看target
- print("target:\n{}".format(iris_dataset['target']))
将收集好的带标签数据(此例中是150 朵花的测量数据)分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(testset)或留出集(hold-out set)。
scikit-learn 中的train_test_split 函数:利用伪随机数生成器打乱数据集并进行拆分。75%训练集,25%测试集(经验比例)分配
标识:数据X,标签y
- from sklearn.model_selection import train_test_split
- X_train, X_test, y_train, y_test = train_test_split(
- iris_dataset['data'], iris_dataset['target'], random_state=0) #data+target
为了确保多次运行同一函数能够得到相同的输出,我们利用random_state 参数指定了随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。
检查数据的最佳方法之一就是将其可视化。如绘制散点图(scatter plot),但只能看两个特征。可以绘制散点图矩阵(pair plot),两两看所有特征。(散点图矩阵无法同时显示所有特征之间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。)
散点图矩阵:首先将NumPy 数组转换成pandas DataFrame。pandas 有一个绘制散点图矩阵的函数,叫作scatter_matrix。pd.plotting.scatter_matrix,其参数介绍https://blog.csdn.net/leilei9406/article/details/83538117?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
矩阵的对角线是每个特征的直方图
- #散点图矩阵
- # 利用X_train中的数据创建DataFrame
- # 利用iris_dataset.feature_names中的字符串对数据列进行标记
- import pandas as pd
- import matplotlib.pyplot as plt
- iris_dataframe = pd.DataFrame(X_train,columns=iris_dataset.feature_names)
- #利用DataFrame创建散点图矩阵,按y_train着色
- grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8)
- plt.show()
scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator类。k 近邻分类算法是在neighbors 模块的KNeighborsClassifier 类中实现的。我们需要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。KNeighborsClassifier 最重要的参数就是邻居的数目
knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。对于KNeighborsClassifier 来说,里面只保存了训练集。
想要基于训练集来构建模型,需要调用knn 对象的fit 方法,输入参数为X_train 和y_train,二者都是NumPy 数组,前者包含训练数据,后者包含相应的训练标签:
- #k neighbors
- from sklearn.neighbors import KNeighborsClassifier
- knn = KNeighborsClassifier(n_neighbors=1)
- knn.fit(X_train, y_train) #构建模型
fit 方法返回的是knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。从中可以看出构建模型时用到的参数
想象一下,我们在野外发现了一朵鸢尾花,花萼长5cm 宽2.9cm,花瓣长1cm 宽0.2cm。这朵鸢尾花属于哪个品种?
我们将这朵花的测量数据转换为二维NumPy 数组的一行,这是因为scikit-learn的输入数据必须是二维数组。
- #预测
- import numpy as np
- X_new = np.array([[5,2.9,1,0.2]])
- print("X_new.shape:{}".format(X_new.shape))
-
- prediction = knn.predict(X_new)
- print("prediction:{}".format(prediction))
- print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))
Prediction: [0]
Predicted target name: ['setosa']
输出了类别和品种
我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例:
- #评估模型
-
- # 对测试数据进行预测
- y_pred = knn.predict(X_test)
- print("test set prediction:\n{}".format(y_pred))
-
- # 两种方法 算预测准确度
- print("test set score:\n{:.2f}".format(np.mean(y_pred == y_test)))
- print("test set score:\n{:.2f}".format(knn.score(X_test, y_test)))
参考《python机器学习基础教程》第一章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。