sklearn交叉验证:y中填充最少的类只有1个成员,小于n_splits=10



我正在一个机器学习项目中工作,当我试图使用交叉验证来了解我需要多少邻居才能在knn中获得最佳精度时,我一直受到这个警告的困扰;这是警告:

The least populated class in y has only 1 members, which is less than n_splits=10.

我使用的数据集是https://archive.ics.uci.edu/ml/datasets/Student+性能

在这个数据集中,我们有几个属性,但我们将只使用";G1"G2〃"G3"学习时间"空闲时间"健康"famrel";。这些列中的所有实例都是整数。https://i.stack.imgur.com/sirSl.png&lt-数据集示例

接下来,这是我分配训练和测试组的第一块代码:

import pandas as pd
import numpy as np
from google.colab import drive
drive.mount('/gdrive')
import sklearn
data=pd.read_excel("/gdrive/MyDrive/Colab Notebooks/student-por.xls")
#print(data.head())
data = data[["G1", "G2", "G3", "studytime","freetime","health","famrel"]]  
print(data)
predict = "G3"

x = np.array(data.drop([predict], axis=1))  
y = np.array(data[predict])  
print(y)
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.3, random_state=42)
print(len(y))
print(len(x))

这就是我分配x和y的方法。用len,我可以看到x和y都有649行,代表649个学生。

这是我执行cross_val时的第二块代码:

#CROSSVALIDATION
from sklearn.neighbors import KNeighborsClassifier
neighbors = list (range(2,30))
cv_scores=[]
#print(y_train)
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
for k in neighbors:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn,x_train,y_train,cv=11,scoring='accuracy')
cv_scores.append(scores.mean())
plt.plot(cv_scores)
plt.show()```

正如你可以告诉的那样,代码是非常不言自明的

警告:

The least populated class in y has only 1 members, which is less than n_splits=10.

发生在for循环的每次迭代中

尽管每次都会出现这种警告,但plt.show((仍然能够绘制一张关于邻居数量的图,以获得良好的准确性,我不知道该图或cv_scores中的读数是否准确。

我的问题是:

我的"y〃中的类;只有1个成员,len(y(明确表示y有649个实例,足以分成59组,每组11个成员?,各位议员是否指";实例";在我的数据集中,还是y组中的列/标签

当我进行训练/测试拆分时,我没有使用stratify=y,它似乎是这个警告的1#解决方案,但在我的情况下它毫无用处。

我已经尝试了我在谷歌/堆栈溢出上看到的一切,但没有任何帮助,数据集似乎是问题所在,但我不明白哪里出了问题。

我认为您的主要错误是使用KNeighborsClassifier,并且您要预测的特征似乎是连续(G3-最终等级(数字:从0到20,输出目标((而不是分类的。

在这种情况下;y";被视为不同的可能类或标签。您获得的消息是,在您的数据集中(在"y"上(,有一些值只出现一次。例如,值3在数据集中只显示一次。这不是一个错误,但表明该模型不能正确或准确地工作。

毕竟,我强烈建议您使用sklearn.neighbors.KNeighborsRegressor

这是用于";连续的";变量而不是类。使用这个模型,你就不应该再遇到这个问题了。输出值将是您定义的最近邻居数量之间的平均值。

通过这些简单的更改,您的问题将得到解决。

相关内容

  • 没有找到相关文章

最新更新