我试图在叶子特征样本上使用Knn。 194列有990行。 第二列填充叶子来自的树名称,它将是标签。
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:Warning:y中填充最少的类只有4个成员,这个成员太少了。任何类的最小组数不能少于n_splits = 5。 %(min_groups,self.n_splits)),警告)
当" cv" > 4," cv"是交叉验证期间我们有多少部分。 我不明白,因为我的样本应该足够大,甚至可以被分成10个。
这里是样本的链接: leaf-sample
提前感谢您的任何帮助
答案 0 :(得分:2)
我的样本应该足够大,甚至可以被分成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),
...