質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

0回答

1483閲覧

ROC曲線を作成できない

shishi_maru440

総合スコア38

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/11/02 21:56

編集2021/11/02 21:59

前提・実現したいこと

予測したモデルからROC曲線を作成したいが1点しか生成されず、直線的なROCになってしまう。
データ数:(va_y:89, va_pred:89)

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ!

イメージ説明

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import seaborn as sns 4import matplotlib.pyplot as plt 5from xgboost import XGBClassifier 6import xgboost as xgb 7from sklearn.preprocessing import LabelEncoder 8from sklearn.preprocessing import MinMaxScaler 9from sklearn.model_selection import KFold 10from sklearn.metrics import mean_squared_error 11from sklearn.metrics import r2_score, log_loss, accuracy_score,f1_score, recall_score, precision_score,confusion_matrix 12import itertools 13 14test = pd.read_csv("test.csv") 15train = pd.read_csv("train.csv") 16 17train_x = train.drop(["disease","id"], axis=1) 18train_x 19 20train_y = train["disease"] 21train_y 22 23test = test.drop(["id"], axis=1) 24 25train_x["Gender"] = train_x["Gender"].replace({"Male":1,"Female":0}) 26test["Gender"] = test["Gender"].replace({"Male":1,"Female":0}) 27 28scores_logloss = [] 29scores_accuracy = [] 30 31params = { 32 "booster": "gbtree", 33 "objective":"binary:logistic'", 34 "eta":0.1, 35 "gamma":0, 36 "alpha":0.1, 37 "lambda":3.0, 38 "min_child_weight":0, 39 "max_depth":7, 40 "subsample":0.8, 41 "colsample_bytree":0.8, 42 "silent":1, 43 "random_state":71} 44 45model = XGBClassifier(n_estimators = 170, ramdom_state=71, 46 max_depth = 7, 47 min_child_weight = 0) 48 49model.fit(tr_x,tr_y) 50 51va_pred = model.predict(va_x) 52 53logloss = log_loss(va_y, va_pred) 54accuracy = accuracy_score(va_y, va_pred > 0.5) 55f1 = f1_score(va_y, va_pred) 56recall = recall_score(va_y,va_pred) 57precision_train = precision_score(va_y, va_pred) 58 59scores_logloss.append(logloss) 60scores_accuracy.append(accuracy) 61 62logloss = np.mean(scores_logloss) 63accuracy = np.mean(scores_accuracy) 64 65from sklearn.metrics import roc_curve, auc 66import matplotlib.pyplot as plt 67 68roc = roc_curve(va_y, va_pred,drop_intermediate=False) 69auc = auc(fpr, tpr) 70fpr, tpr, thresholds = roc_curve(va_y, va_pred,drop_intermediate=False) 71 72plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc) 73plt.plot(np.linspace(1, 0, len(fpr)), np.linspace(1, 0, len(fpr)), label='Random ROC curve (area = %.2f)'%0.5, linestyle = '--', color = 'gray') 74 75plt.legend() 76plt.title('ROC curve') 77plt.xlabel('False Positive Rate') 78plt.ylabel('True Positive Rate') 79plt.grid(True) 80plt.show() 81 82

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/11/02 23:06

>■■な機能を実装中に以下のエラーメッセージが発生しました。 ■■のような表現をしないで具体的な内容を提示してください。 また、エラーメッセージ、試したことが未記載ですので質問を編集して 追記していただけませんか。
jbpb0

2021/11/03 09:49 編集

fpr, tpr, thresholds = roc_curve(va_y, va_pred,drop_intermediate=False) のすぐ上に print(va_pred) を追加して、「va_pred」の数値を確認してみてください 「va_pred」が、たとえば0, 1だけとかの2値だと、そうなります たとえば0.0〜1.0とかの浮動小数点数ならば、もっとたくさんの点が計算され、グラフは滑らかに表示されるはずです
shishi_maru440

2021/11/03 12:09

おっしゃる通り、array([1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0])となっていました。
jbpb0

2021/11/04 09:14 編集

va_pred = model.predict(va_x) のすぐ下に print(va_pred) を追加した場合は、どうでしょうか? 0.0〜1.0の浮動小数点数ならば、それをそのまま fpr, tpr, thresholds = roc_curve(va_y, va_pred,drop_intermediate=False) に使ってみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問