1.数据:
依旧使用经典的Iris数据集。
2.任务:
使用 kNN(k-近邻算法)分类算法实现鸢尾花分类。
3.方法:
使用机器学习工具库scikit-learn中的以下方法。
- 数据集划分:train_test_split()
- 计算k-近邻距离:
3.1 kNN(k-NearestNeighbor)
kNN(k-NearestNeighbor),k-近邻算法是一种基于样本/实例的算法。
步骤:
- 计算出测试样本和所有训练样本的距离;
- 为测试样本选择k个与其距离最小的训练样本;
- 统计出k个训练样本中大多数样本所属的分类;
- 这个分类就是待分类数据所属的分类。
通用代码模式:
- KNeighborsClassifier(),默认k=5,申明模型;
- fit(),训练模型;
- score(),计算得分
4.代码:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
data_file = './data/Iris.csv'
# 使用特征列
feature_columns = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
# 类别列
Species_dict = {
'Iris-setosa':0, # 山鸢尾
'Iris-versicolor':1, # 变色鸢尾
'Iris-virginica':2 # 维吉尼亚鸢尾
}
def main():
"""
主函数
"""
# 读取数据,将Id列设置为索引列
iris_data = pd.read_csv(data_file,index_col='Id')
# 使用map()函数将类别转变为相对应的数字
iris_data['Label'] = iris_data['Species'].map(Species_dict)
# 获取数据集特征
X = iris_data[feature_columns].values
# 获取数据标签
y = iris_data['Label'].values
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/3,random_state=10)
# 声明模型
knn_model = KNeighborsClassifier()
# 训练模型
knn_model.fit(X_train,y_train)
# 评价模型
accuracy = knn_model.score(X_test,y_test)
print('模型准确率为:{:.2f}'.format(accuracy * 100))
# 获取单个测试样本
idx = 10
test_sanple_feature = [X_test[idx,:]]
# 真实标签
y_true = y_test[idx]
# 获取样本的预测标签
y_predict = knn_model.predict(test_sanple_feature)
print('样本{}的真实标签为{},预测标签为{}'.format(idx,y_true,y_predict))
if __name__ == '__main__':
main()
5.输出结果:
模型准确率为:96.00
样本10的真实标签为1,预测标签为[1]