TPOT: 多类数据分类失败

我无法让TPOT(版本0.9.2,Python 2.7)在多类数据上工作(尽管我在TPOT的文档中没有找到任何说明它仅支持二元分类的内容)。

下面提供了一个示例。它运行到9%然后就崩溃了,报错如下:

RuntimeError: TPOT优化过程中出现了错误。这可能是因为数据格式不正确,或者是因为将回归问题的数据提供了给TPOTClassifier对象。请确保您正确地将数据传递给了TPOT。

但是将n_classes改为2后,它就能正常运行了。

from sklearn.metrics import f1_score, make_scorerfrom sklearn.datasets import make_classificationfrom tpot import TPOTClassifierscorer = make_scorer(f1_score)X, y = make_classification(n_samples=200, n_features=100,                           n_informative=20, n_redundant=10,                           n_classes=3, random_state=42)tpot = TPOTClassifier(generations=10, population_size=20, verbosity=20, scoring=scorer)tpot.fit(X, y)

回答:

实际上,TPOT也应该能处理多类数据 – 文档中的示例使用的是MNIST数据集(10个类别)。

错误与f1_score有关;保持您的代码使用n_classes=3,并请求

tpot = TPOTClassifier(generations=10, population_size=20, verbosity=2)

(即使用默认的scoring='accuracy')可以正常工作:

警告:xgboost.XGBClassifier不可用,TPOT将不会使用它。第1代 - 当前最佳内部CV得分:0.7447422496202984第2代 - 当前最佳内部CV得分:0.7447422496202984第3代 - 当前最佳内部CV得分:0.7454927186634503第4代 - 当前最佳内部CV得分:0.7454927186634503第5代 - 当前最佳内部CV得分:0.7706334316090413第6代 - 当前最佳内部CV得分:0.7706334316090413第7代 - 当前最佳内部CV得分:0.7706334316090413第8代 - 当前最佳内部CV得分:0.7706334316090413第9代 - 当前最佳内部CV得分:0.7757616367372464第10代 - 当前最佳内部CV得分:0.7808898418654516最佳管道:LogisticRegression(KNeighborsClassifier(DecisionTreeClassifier(input_matrix, criterion=entropy, max_depth=3, min_samples_leaf=15, min_samples_split=12), n_neighbors=6, p=2, weights=uniform), C=0.01, dual=False, penalty=l2)TPOTClassifier(config_dict={'sklearn.linear_model.LogisticRegression': {'penalty': ['l1', 'l2'], 'C': [0.0001, 0.001, 0.01, 0.1, 0.5, 1.0, 5.0, 10.0, 15.0, 20.0, 25.0], 'dual': [True, False]}, 'sklearn.decomposition.PCA': {'iterated_power': range(1, 11), 'svd_solver': ['randomized']}, 'sklearn.feature_selection.Se...ocessing.PolynomialFeatures': {'degree': [2], 'interaction_only': [False], 'include_bias': [False]}},        crossover_rate=0.1, cv=5, disable_update_check=False,        early_stop=None, generations=10, max_eval_time_mins=5,        max_time_mins=None, memory=None, mutation_rate=0.9, n_jobs=1,        offspring_size=20, periodic_checkpoint_folder=None,        population_size=20, random_state=None, scoring=None, subsample=1.0,        verbosity=2, warm_start=False)

按照文档中建议的用法请求F1得分,即:

tpot = TPOTClassifier(generations=10, population_size=20, verbosity=2, scoring='f1')

再次产生了您报告的错误,可能是因为f1_score中的默认参数average='binary',这确实对多类问题没有意义,而简单的f1仅适用于二元问题(文档)。

scoring中明确使用F1得分的其他变体,例如f1_macrof1_microf1_weighted可以正常工作(未显示)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注