Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=1/3, random_state=85)
models = [
RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42),
LinearSVC(),
MultinomialNB(),
LogisticRegression(random_state=0),
]
# 5 Cross-validation
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
model_name = model.__class__.__name__
accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
for fold_idx, accuracy in enumerate(accuracies):
entries.append((model_name, fold_idx, accuracy))
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
错误:
用户警告:y中填充最少的类只有1个成员,小于n_splits=5。
使用交叉验证时,它会拆分整个训练集,以便训练和测试(在cv中(具有相同的分布。如果有10个标为"0"的物体;A";,大约占整个例子的20%,它将把它分成每组,每组有2个带有标签"的对象;A";因此,它也将从测试中获得20%。
但是当一个标签";A";只有一个对象(该类的一行(,并且您试图将其拆分为5组?这是一个错误。它不知道该如何处理。
如果不知道你的数据是什么样子以及你的需求是什么,就很难知道如何解决它。不同的问题可能有不同的解决方案。
您可以:
- 从数据集中删除有问题的标签。检查具有极低频率的所有类别,并将它们全部分组为"0";其他";或者类似的东西
- 放弃cv,使用
KFolds
,这不要求cv中的组具有相同的分布