让机器实现对鸢尾花的分类分析,它会怎么做呢?我们首先列举出可能需要的要素:数据,模型和算法,效果评估。机器学习,它也是需要对自己的学习效果进行评估,因为它需要根据结果来调整参数。
大多数情况需要人来介入这个过程,人们需要根据自身的经验来选取一些合适的参数,但是“爱偷懒”的数据科学家同时也提出一些自动化的程序来实现这一步骤。
from sklearn import datasets
import numpy as np
iris_data = datasets.load_iris()
print(type(iris_data))
# data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量数据,格式为NumPy数组
这里用到一个库——sklearn,它是一个基于Python的开源机器学习库,广泛应用于数据挖掘和数据分析领域。它提供众多简单高效的工具,帮助我们执行机器学习任务,包括分类,回归,分类等问题。Sklearn官网访问地址
我们将iris_data数据类型打印出来之后,发现它是一个 Bunch对象:
我们进一步查看数据内容可以得到:花的样本数据,类别及品种。
数据特征:数据集共150条记录,每类各50个数据,每条记录有花萼长度、花萼宽度、花瓣长度、花瓣宽度4项特征。花的品种包含分别为:
‘setosa’,‘versicolor’,‘virginica’.
示例代码如下:
print(iris_data['data']) # 花的样本数据
print(f"花的样本数量: {iris_data['data'].shape}")
print(f"花的前5个样本数据: {iris_data['data'][:5]}")
# 0代表 setosa, 1代表 versicolor, 2代表 virginica
print(iris_data['target']) # 类别
print(iris_data['target_names']) # 花的品种
我们需要选取数据集的特征来训练模型,在上文中我们知道鸢尾花数据集一共4列,实际上对应四个特征,我们这里选取全部特征。
实际上,在某些情况下,我们构建模型时并不是选取特征越多越好。在这里提供的鸢尾花数据是一个标准示例,也就是经过反复验证过的数据集。
思考题:如果在这里选取两个特征,它对模型的训练和预测会有什么影响吗?(可以更改代码’X = iris_data[‘data’][:,:]'为iris_data[‘data’][:,:2],表示选取前两个特征。)
from sklearn.model_selection import train_test_split
X = iris_data['data'][:,:] # 获取全部特征
y = iris_data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
from sklearn.preprocessing import StandardScaler
# 均值方差归一化
standardScaler = StandardScaler()
# 先基于训练集数据进行拟合,计算用于标准化的统计量(均值、方差等)
standardScaler.fit(X_train)
# 得到原始数据特征值的均值和方差
X_train_avg = np.round(X_train.mean(axis=0), 2) #保留两位小数
X_train_var = np.round(X_train.var(axis=0),2)
# 打印均值和方差
N = len(X[0])
for i in range(N):
print(f'特征{i+1}的均值为{X_train_avg[i]},方差为{X_train_var[i]}')
# 对训练集和测试集进行标准化
X_train_std = standardScaler.transform(X_train)
X_test_std = standardScaler.transform(X_test)
归一化的作用和意义:归一化可以最大程度的去除极大值和极小值的边缘值对于数据的影响,将数据转化为符合正态分布的数据。
我们得到每一个特征的均值和方差:
KNN或称为 k最邻近算法,是有监督学习中的分类算法 。它可以用于分类或回归问题,但它通常用作分类算法。
from sklearn.neighbors import KNeighborsClassifier
# 构建KNN模型
estimator = KNeighborsClassifier(n_neighbors=5)
# 训练模型
estimator.fit(X_train, y_train)
y_pre = estimator.predict(X_test) # 预测值
score = np.round(estimator.score(X_test, y_test),2) # 准确率
print("实际结果为:\n", y_test)
print("预测结果为:\n", y_pre)
print("对比结果为:\n", y_pre == y_test)
print("准确率为:\n", score)