繁体   English   中英

Scikit-Learn:K-nn交叉验证错误(人口最少的类……)

[英]Scikit-Learn : Error on K-nn Crossvalidation (the least populated class …)

我正在尝试在叶子特征样本上使用Knn。 有990列,共194列。 第二列用树叶来自的树名填充,它将成为标签。

from sklearn import model_selection 
from sklearn.preprocessing import LabelEncoder
from sklearn import preprocessing
from sklearn import neighbors, metrics

X = data.iloc[:, 2: 194]
y = data.iloc[:,1]
labelencoder = LabelEncoder()
y = labelencoder.fit_transform(y)

#separate train and test data
X_train, X_test, y_train, y_test = \
model_selection.train_test_split(X, y , test_size=0.3)

std_scale = preprocessing.StandardScaler().fit(X_train)
X_train_std = std_scale.transform(X_train)
X_test_std = std_scale.transform(X_test)

param_grid = {'n_neighbors':[3,5,7,9,11,13,15]}
score = 'accuracy'
clf = model_selection.GridSearchCV(neighbors.KNeighborsClassifier(),
param_grid, cv=5, scoring=score)
#here i got the following error

clf.fit(X_train_std, y_train)

C:\\ Users \\ chrys \\ Anaconda3 \\ lib \\ site-packages \\ sklearn \\ model_selection_split.py:581:警告:y中人口最少的类只有4个成员,这太少了。 任何类的最小组数不能小于n_splits = 5。 %(min_groups,self.n_splits)),警告)

我知道,当“ cv”> 4时,“ cv”就是交叉验证期间我们拥有的零件数。 我不明白,因为我的样本应该足够大,可以除以10。

这里是样本的链接: leaf-sample

预先感谢您的任何帮助

我的样本应该足够大,可以除以10

仅当您使用整个数据集进行训练时,才如此。 因为您已经(正确地)将数据拆分为测试和训练集,所以很可能您至少有一个类的实例少于交叉验证拆分数。 特别是对于具有100个类,每个类仅包含10个实例的数据集。

您可以使用以下方法检查训练集标签:

count = {k:0 for k in set(y)}
for yy in y:
    count[yy] += 1
sorted(count.items(), key=lambda i: i[1])

当我运行您的代码时,我有四个类别的交叉验证少于5个:

[(23, 4),
 (39, 4),
 (68, 4),
 (85, 4),
 (17, 5),
 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM