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折交叉验证每次计算的均值对应的准确度
交叉验证与传统分类相比较
将交叉验证用到网格搜索中