K近邻算法——sklearn:预测鸢尾花分类&&样本集拆分

实现功能:根据鸢尾花花瓣和花萼的长宽来预测鸢尾花所属的分类
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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值