

以下のコードで色々試してもエラーになります。引数を指定してくださいとも出ますが、どこでどれに何の引数を渡せばいいのか分かりません。  
どなたかアドバイスお願いします。

**ソースコード**

[code]

    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    from sklearn.utils import all_estimators
    
    import warnings
    warnings.filterwarnings('ignore')
    
    # アヤメデータの読み込み
    iris_data = pd.read_csv("iris.csv", encoding="utf-8")
    
    # アヤメデータをラベルと入力データに分離する
    y = iris_data.loc[:,"Name"]
    x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
    
    # 学習用とテスト用に分離する
    warnings.filterwarnings('ignore')
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, train_size = 0.8, shuffle = True)
    
    # classifierのアルゴリズム全てを取得する --- (*1)
    warnings.filterwarnings('ignore')
    allAlgorithms = all_estimators(type_filter="classifier")
    
    for(name, algorithm) in allAlgorithms:
        # 各アリゴリズムのオブジェクトを作成 --- (*2)
        clf = algorithm()
    
        # 学習して、評価する --- (*3)
        clf.fit(x_train, y_train)
        y_pred = clf.predict(x_test)
        print(name,"の正解率 = " , accuracy_score(y_test, y_pred))
    
[/code]

**実行結果**

[code]

    AdaBoostClassifier の正解率 =  0.9333333333333333
    BaggingClassifier の正解率 =  0.9333333333333333
    BernoulliNB の正解率 =  0.3
    CalibratedClassifierCV の正解率 =  0.9
    CategoricalNB の正解率 =  0.9666666666666667
    Traceback (most recent call last):
      File "/Users/fujiokamasaya/PycharmProjects/project/test2.1.py", line 27, in <module>
        clf = algorithm()
    TypeError: __init__() missing 1 required positional argument: 'base_estimator'
    
    
    プロセスは終了コード 1 で完了しました
    
[/code]


CC BY-SA 4.0
2020-02-25T10:28:12.243
63346
2020-02-26T03:23:51.607
2020-02-25T10:50:56.090
32986
37890
question
python python3
各アルゴリズムの正解率を確かめるで、fitでエラーになります: TypeError: __init__() missing 1 required positional argument


参考にされた書籍に載っていたプログラムがライブラリのアップデートを考慮していなかったか、この部分に対する対処が書籍に載っているけれど読み落としているかどちらかなのではないかと思います。

scikit-learn 0.22.1 で試したところ、`all_estimators(type_filter="classifier")`
は次の順番で出力していました。

  * AdaBoostClassifier
  * BaggingClassifier
  * BernoulliNB
  * CalibratedClassifierCV
  * CategoricalNB
  * ClassifierChain
  * ...

今回エラーが出ているのはおそらく [`ClassifierChain`](https://scikit-
learn.org/stable/modules/generated/sklearn.multioutput.ClassifierChain.html)
に対して `__init__()` を実行しようとしたからでしょう（`clf = algorithm()` の行です）。`ClassifierChain`
は初期化時に必ず `base_estimator` オプションが必要ですが、このプログラムでは引数を何も渡していません。

対処法ですが、そもそも様々な分類器に対して一挙にループを回して分類しようとしているのがやや無理がありそうです。場当たり的な対処としては何かしらエラーが出る度にその分類器を回避する
if 文を付け加えるのが考えられます。たとえば下のように単にスキップしたり、あるいは他の処理をしたりなどです。

[code]

    for(name, algorithm) in allAlgorithms:
        if name == 'ClassifierChain':
            continue
    
        # 各アリゴリズムのオブジェクトを作成 --- (*2)
        clf = algorithm()
    
        # ...
    
[/code]


CC BY-SA 4.0
2020-02-26T03:23:51.607
63360
2020-02-26T03:23:51.607
19110
63346
answer