

下記コードでどこかおかしいところがあるか、教えていただけますでしょうか。  
irisパッケージで10クロスバリデーションを行い、ROC曲線を記載することを目標にしています。  
irisの品種を１つ消して、2クラス分類としています。  
最後のAUC値が1.0になってしまい、どこかでエラーが起きているでしょうか？  
Google Colabを使用しております。

[code]

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    iris = sns.load_dataset("iris")
    df = iris.drop(iris[iris['species'] == 'setosa'].index)
    X = df.drop("species", axis =1).values
    y = df["species"]
    y = y.replace({'versicolor': 0, 'virginica': 1})
    y = y.values
    from sklearn.ensemble import RandomForestClassifier
    model = RandomForestClassifier(n_estimators =40)
    from sklearn.model_selection import cross_val_score
    from sklearn.metrics import roc_curve, roc_auc_score
    score_cv= cross_val_score(model, X, y, cv = 10, scoring="roc_auc")
    mean_AUC=np.mean(score_cv)
    from sklearn.model_selection import KFold
    cv = KFold(n_splits=10, shuffle=True)
    probas_list = []
    for train_index, test_index in cv.split(X):
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        model.fit(X_train, y_train)
        probas = model.predict_proba(X_test)
        probas_list.append(probas[:, 1])
    from sklearn import metrics
    mean_proba = np.mean(probas_list, axis=0)
    fpr, tpr,thresholds = roc_curve(y_test, mean_proba)
    roc_auc = metrics.auc(fpr, tpr)
    roc_auc
    
[/code]


CC BY-SA 4.0
2023-07-12T06:07:08.520
95572
2023-07-14T10:43:56.433
2023-07-12T06:44:43.560
3060
54416
question
python google-colaboratory
10-cvでROC曲線を記載することを目指してます、コードエラーをご指摘お願いできますか？


コードにおかしいところはなさそうです。  
平均訓練データAUCスコアと平均テストデータAUCスコアを出してみました。  
訓練では平均AUCスコアが1.0ですが、テストデータでもそれなりの値になっているので過学習していても顕著ではないと思います。

### 結果の一例

[code]

    ROC-AUC: 1.0
    平均交差検証AUCスコア: 0.9719999999999999
    平均訓練データAUCスコア: 1.0
    平均テストデータAUCスコア: 0.9880000000000001
    
[/code]

### 確かめたコード

[code]

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    iris = sns.load_dataset("iris")
    df = iris.drop(iris[iris['species'] == 'setosa'].index)
    X = df.drop("species", axis =1).values
    y = df["species"]
    y = y.replace({'versicolor': 0, 'virginica': 1})
    y = y.values
    from sklearn.ensemble import RandomForestClassifier
    model = RandomForestClassifier(n_estimators =40)
    from sklearn.model_selection import cross_val_score
    from sklearn.metrics import roc_curve, roc_auc_score
    score_cv= cross_val_score(model, X, y, cv = 10, scoring="roc_auc")
    mean_AUC=np.mean(score_cv)
    from sklearn.model_selection import KFold
    cv = KFold(n_splits=10, shuffle=True)
    probas_list = []
    # 以下2行追加
    train_auc_scores = []
    test_auc_scores = []
    
    for train_index, test_index in cv.split(X):
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        model.fit(X_train, y_train)
        # 以下4行追加
        train_pred = model.predict_proba(X_train)
        test_pred = model.predict_proba(X_test)
        train_auc_scores.append(roc_auc_score(y_train, train_pred[:, 1]))
        test_auc_scores.append(roc_auc_score(y_test, test_pred[:, 1]))
        probas = model.predict_proba(X_test)
        probas_list.append(probas[:, 1])
    from sklearn import metrics
    mean_proba = np.mean(probas_list, axis=0)
    fpr, tpr, thresholds = roc_curve(y_test, mean_proba)
    roc_auc = metrics.auc(fpr, tpr)
    roc_auc
    # 以下4行追加
    print(f"ROC-AUC: {roc_auc}")
    print(f"平均交差検証AUCスコア: {mean_AUC}")
    print(f"平均訓練データAUCスコア: {np.mean(train_auc_scores)}")
    print(f"平均テストデータAUCスコア: {np.mean(test_auc_scores)}")
    
[/code]


CC BY-SA 4.0
2023-07-13T02:33:29.697
95583
2023-07-13T02:33:29.697
35558
95572
answer