python - TPOT:多类数据分类失败

标签 python machine-learning scikit-learn tpot

我无法让 TPot(v. 0.9.2,Python 2.7)处理多类数据(尽管我在 TPot 的文档中找不到任何说它只进行二进制分类的内容)。

下面提供了一个例子。它运行到 9%,然后因错误而死掉:

RuntimeError: There was an error in the TPOT optimization process. 
This could be because the data was not formatted properly, or because
data for a regression problem was provided to the TPOTClassifier 
object. Please make sure you passed the data to TPOT correctly.

但是将 n_classes 更改为 2,它运行正常。

from sklearn.metrics import f1_score, make_scorer
from sklearn.datasets import make_classification
from tpot import TPOTClassifier

scorer = 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 也应该处理多类数据 - example in the docs与 MNIST 数据集(10 类)。

错误与f1_score有关;用 n_classes=3 保存你的代码,并要求

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

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

Warning: xgboost.XGBClassifier is not available and will not be used by TPOT.

Generation 1 - Current best internal CV score: 0.7447422496202984                                                                                
Generation 2 - Current best internal CV score: 0.7447422496202984                                                                                  
Generation 3 - Current best internal CV score: 0.7454927186634503                                                                                   
Generation 4 - Current best internal CV score: 0.7454927186634503             
Generation 5 - Current best internal CV score: 0.7706334316090413
Generation 6 - Current best internal CV score: 0.7706334316090413
Generation 7 - Current best internal CV score: 0.7706334316090413
Generation 8 - Current best internal CV score: 0.7706334316090413
Generation 9 - Current best internal CV score: 0.7757616367372464
Generation 10 - Current best internal CV score: 0.7808898418654516

Best pipeline: 

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)

使用 suggested in the docs 查询 F1 分数,即:

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

再次产生您报告的错误,可能是因为 default argument f1_score中的是average='binary',对于多类问题确实没有意义,而简单的f1只是对binary问题 ( docs )。

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

关于python - TPOT:多类数据分类失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625353/

相关文章:

python - 对 Pandas DataFrames 使用逻辑或 bool 索引的正确语法是什么?

python - 我如何找到模型将输入分类为 [0,1] 的概率

python - 将 sklearn 的 GridSearchCV 与管道一起使用,只需预处理一次

python - scikit learn clf.fit/评分模型准确性

python - 如何停用 sklearn TfidfVectorizer 的默认停用词功能

python - 迭代或惰性水库采样

python - 在 Pandas 数据框中查找最近日期时间的索引

scikit-learn - 如何在线性回归模型中定义保留排名的得分函数?

python - 解析俄语站点编码错误

python - 在线/流媒体学习的验证