实现功能:根据鸢尾花花瓣和花萼的长宽来预测鸢尾花所属的分类
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from pandas import Series, DataFrame
# 加载内置数据集
iris = load_iris()
data = iris.data
# 标签是离散的类别,故是分类模型;(回归是连续的值)
target = iris.target
feature_names = iris.feature_names
target_names = iris.target_names
data = DataFrame(data, columns=feature_names)
# 鸢尾花的样本标签
target_num = target.size # target_num=150
# 实例化knn算法类
knn = KNeighborsClassifier(n_neighbors=5)
'''代码有缺陷,未考虑各类标签'''
# --------------------------
# 拆分样本集:为了将训练集与测试集分开,一般比例为7:3或8:2
# x_train = data[0:120]
# x_test = data[120:]
# y_train = target[0:120]
# y_test = target[120:]
# # 有标签的学习称为:有监督学习
# # 无标签的学习称为:无监督学习
# # x_train可理解为卷子,y_train理解为答案
# # 训练集必须是VSM格式(二维表格,行表示数据向量,列表示字段)
# knn.fit(x_train, y_train)
# # 训练集的表格格式的字段必须与训练集一致
# y_predict_result = knn.predict(x_test)
# # 预测准确率
# acc = (y_predict_result == y_test).sum() / y_predict_result.size
# print(acc)
# --------------------------
# 随机索引打乱样本集排序后进行预测
# random_index = np.random.permutation(150)
# y = target[random_index]
# x = np.array(data)[random_index]
# # 样本集拆分
# x_train = x[0:120]
# x_test = x[120:]
# y_train = y[0:120]
# y_test = y[120:]
# # 有标签的学习称为:有监督学习
# # 无标签的学习称为:无监督学习
# # x_train可理解为卷子,y_train理解为答案
# # 训练集必须是VSM格式(二维表格,行表示数据向量,列表示字段)
# knn.fit(x_train, y_train)
# # 训练集的表格格式的字段必须与训练集一致
# y_predict_result = knn.predict(x_test)
# # 预测准确率
# acc = (y_predict_result == y_test).sum() / y_predict_result.size
# print(acc)
#----------------------------------------
# 评价模型好坏不能只看评分,比较不同的拆分策略取平均值,是一种常用策略
# 做10次随机索引,比较不同的拆分策略
def split_train_target(x, y, train_size, random_seed):
'''
按照比例拆分数据为训练数据集与测试数据集
:param x:
:param y:
:param train_size: 训练数据拆分比例
:param random_seed: 固定随机种子——可以保证每次样本拆分集的顺序是一样的
:return:
'''
# 由于每次拆分样本集的随机性不一样,即使固定相同比例,仍得不到更加中肯的评价结果
# 不同随机数种子会影响随机结果,所以为解决公平问题,需固定随机顺序
np.random.seed(random_seed) # 随机种子可以保证每次样本拆分集的顺序是一样的
random_index = np.random.permutation(y.size)
x = np.array(x)[random_index]
y = np.array(y)[random_index]
n_split = int(y.size * train_size)
x_train = x[:n_split]
x_test = x[n_split:]
y_train = y[:n_split]
y_test = y[n_split:]
return x_train, x_test, y_train, y_test
# 调用带种子函数的样本集拆分函数
acc_list = []
for i in range(10):
x_train, x_test, y_train, y_test = split_train_target(data, target, 0.8, i)
knn.fit(x_train, y_train)
acc = knn.score(x_test, y_test)
acc_list.append(acc)
# 均值
mean = np.array(acc_list).mean()
# 标准差
std = np.array(acc_list).std()
print(mean, std)