交叉验证评估wine的分类。

对红酒品种进行分类。

Wine葡萄酒数据集是来自UCI上面的公开数据集,这些数据是对意大利同一地区种植的葡萄酒进行化学分析的结果,这些葡萄酒来自三个不同的品种。该分析确定了三种葡萄酒中每种葡萄酒中含有的13种成分的数量。

在wine数据集中,这些数据包括了三种酒中13种不同成分的数量。文件中,每行代表一种酒的样本,共有178个样本;一共有14列,其中,第一个属性是类标识符,分别是1/2/3来表示,代表葡萄酒的三个分类。后面的13列为每个样本的对应属性的样本值。剩余的13个属性是,酒精、苹果酸、灰、灰分的碱度、镁、总酚、黄酮类化合物、非黄烷类酚类、原花色素、颜色强度、色调、稀释葡萄酒的OD280/OD315、脯氨酸。其中第1类有59个样本,第2类有71个样本,第3类有48个样本。



#导入对应的库函数

import numpy as np

from sklearn.neighbors import KNeighborsClassifier

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.model_selection import cross_val_score

import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV


names=['0Alcohol','1Malic acid ','2Ash','3Alcalinity of ash',

         '4Magnesium','5Total phenols','6Flavanoid',

         '7Nonflavanoid phenols','8Proanthocyanins ','9Color intensity ','10Hue ','11OD280/OD315 of diluted wines' ,'12Proline ','13category']

#数据的导入

data=pd.read_csv(r"C:\Users\Lenovo\Desktop\wine.csv",names=names)

print(data)

#对样本特征和样本标签的划分

X=data.iloc[:,1:]

Y=data.iloc[:,0]

# print(X)

# print(Y)
#从样本特征中选择3个对样本标签影响最大的的特征值
from sklearn.feature_selection import SelectKBest,f_regression

selector=SelectKBest(f_regression,k=3)

X=selector.fit_transform(X,Y)

print(X)

#看哪几种对

types=selector.get_support(indices=True).tolist()

for i in range(3):

    types[i]+=1

print(f"对样本影响最高的三种特征为:",{*data.columns[types]})



#训练集和测试集的划分

x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

a=[]

k=[]

for i in range(1,30):

    classify=KNeighborsClassifier(n_neighbors=i)
#交叉验证:cv=5选择五折,scoring=“accuracy”表示求准确度

    scores = cross_val_score(classify, X, Y, cv=5, scoring="accuracy")

    accuracy=scores.mean()

    a.append(accuracy)

    # print(accuracy)

    classify.fit(x_train,y_train)

    accuracy_2=classify.score(x_test,y_test)

    k.append(accuracy_2)

print(a)

# 绘制不同k值的准确度图像

best_k=np.argmax(a)

print(f"交叉验证得到最佳的k值为{best_k+1},对应的准确率为:{a[best_k]}")

best_k_2=np.argmax(k)

print(f"传统划分数据得到最佳的k值为{best_k_2+1},对应的准确率为:{k[best_k_2]}")
 
# 绘制不同k值的准确度图像

best_k=np.argmax(a)+1

print(f"最佳的k值为{best_k},对应的准确率为:{a[best_k]}")

plt.plot(np.arange(1,30),a,color="blue",marker='*',linestyle='dashed',markerfacecolor='red',markersize=10)

plt.title('Accuracy Rate K Value')

# 横纵坐标名称

plt.xlabel('K Value')

plt.ylabel('Accuracy')

plt.show()
# 在网格搜索中用到交叉验证
knn=KNeighborsClassifier()

param_dic={"n_neighbors":[i for i in range(1,30)]}

gscv=GridSearchCV(knn,param_grid=param_dic,cv=5,scoring="accuracy")

gscv.fit(x_train,y_train)

Score=gscv.score(x_test,y_test)

print(f"网格搜索得到最佳的k值为{gscv.best_index_},对应的准确率为:{gscv.best_score_}")
 

k值从1到30进行5折交叉验证每次计算的均值对应的准确度

交叉验证与传统分类相比较

将交叉验证用到网格搜索中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值