

分類モデルの作成をしてまして、モデルの選択  
ロジスティック回帰と決定木、ランダムフォレスト、SVMの4つのモデルを作成して比較で #
for文でリストからモデルを取り出し、学習と予測、F1値の出力を行う。為のコードがどうしてもわからなく悩んでいます。ご教示お願い致します。

コード

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
    from sklearn.model_selection import train_test_split
    
    # JupyterNotebook上でグラフを表示する設定
    %matplotlib inline
    # DataFrameで全ての列を表示する設定
    pd.options.display.max_columns = None
    
    # 要約統計量を表示
    dataset = sns.load_dataset("titanic")
    
    dataset = dataset[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']]
    dataset.head()
    
    dataset.describe()
    
    # 各列の欠損値の数を確認
    a = dataset.isnull().sum()
    b = pd.isnull(dataset[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']]).sum()
    
    print(a)
    print(b)
    
    # ageの欠損値を平均値にて補完
    dataset['age'] = dataset['age'].fillna(dataset['age'].mean())
    dataset.head()
    
    
    # 乗船者数の多い港を value_counts メソッドで確認
    dataset_em = dataset['embarked'].value_counts()
    print(dataset_em)
    
    # 補完後の欠損値が0であることを確認  #embarkedに欠損値あり 2
    dataset.info()
    
    # datasetのsexとembarkedをダミー変数に変換してdataset2に代入する
    dataset2 = pd.get_dummies(data=dataset, columns=['sex', 'embarked'])
    
    # dataset2のデータの最初の5行を表示
    dataset2.head()
    
    # dataset2より目的変数と説明変数に該当する列を取得してnumpy配列に変換し、変数YとXに格納する
    # Y:目的変数に該当する列
    Y = np.array(dataset2['survived'])
    # X:説明変数に該当する列。dataset2からsurvivedを除外
    X = np.array(dataset2[['survived', 'pclass', 'age', 'sibsp', 'parch', 'fare', 'sex_female', 'sex_male', 'embarked_C', 'embarked_Q', 'embarked_S']])
    
    # 形状を確認
    print("Y=", Y.shape, ", X=", X.shape)
    
    # X と Y を 機械学習用データとテストデータに7:3に分ける(X_train, X_test, Y_train, Y_test)
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
    
    # 機械学習用データを、学習データと検証データに7:3に分ける(X_train, X_valid, Y_train, Y_valid)
    X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.3, random_state=0)
    
    # 形状を確認:X_train, X_valid, X_test, Y_train, Y_valid, Y_test
    print("Y_train", Y_train.shape, ", X_train", X_train.shape)
    print("Y_valid", Y_valid.shape, ", X_valid",X_valid.shape)
    print("Y_test", Y_test.shape, ", X_test", X_test.shape)
    
[/code]

**下記コードのモデルの選択でロジスティック回帰と決定木、ランダムフォレスト、SVMの4つのモデルを作成して比較**

[code]

    # 必要なライブラリのインポート
    from sklearn.linear_model import LogisticRegression
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.svm import SVC
    from sklearn.metrics import f1_score
    from sklearn.model_selection import cross_val_score
    
    # 空のリストを用意
    model_list = []
    
    # リストにモデルを追加。それぞれの引数は警告を出さないための設定
    model_list.append(LogisticRegression(solver='lbfgs', multi_class='multinomial', max_iter=1000))
    model_list.append(DecisionTreeClassifier(criterion='entropy'))
    model_list.append(RandomForestClassifier(n_estimators=100))
    model_list.append(SVC(gamma='scale'))
    
    # for文でリストからモデルを取り出し、学習と予測、F1値の出力を行う　←これが分かりません。
    
[/code]


CC BY-SA 4.0
2020-10-24T05:41:37.647
71473
2020-10-25T02:37:10.543
2020-10-24T05:54:48.887
3060
40847
question
python 機械学習
分類モデルの作成


「# リストにモデルを追加。それぞれの引数は警告を出さないための設定」という行と、  
「#
for文でリストからモデルを取り出し、学習と予測、F1値の出力を行う」という行の間で、４つのモデルを、配列model_listに追加(append)していますから、配列の中身は以下のようになっているはずです。

[code]

    model_list[0]に、LogisticRegression(solver='lbfgs', multi_class='multinomial', max_iter=1000)
    model_list[1]に、DecisionTreeClassifier(criterion='entropy')
    model_list[2]に、RandomForestClassifier(n_estimators=100)
    model_list[3]に、SVC(gamma='scale')
    
[/code]

あとは、

[code]

    f_value_list = [] #F1値を記録する配列を用意する
    
    for i in range(4): #4つのモデルで学習と予測を行い、それぞれのF1値を得る。得られたF1値は配列f_value_listに記録する。
        model = model_list[i] # i番目のモデルを取り出す。
        # modelを用いた学習と予測を行ってF値を得る。(モデルの仕様などが判らないので、学習と予測をするコード、F値を計算するコード等を示すことができません。省略させて頂きます）
        # F1値が変数FVに入ると仮定する
        f_value_list[i] = FV
    
    for i in range(4): # F1値を表示する
        print('{0} 番目のモデルのF値: {1}'.format{i+1, f_value_list[i]})
    
[/code]

というような感じで進めていけば良いのではないでしょうか。


CC BY-SA 4.0
2020-10-25T02:37:10.543
71489
2020-10-25T02:37:10.543
217
71473
answer