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

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

ただいまの
回答率

88.09%

適合率、再現率の計算でわからないこと

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 399

前回の質問のかいもあってコードを実行することができ、実際に実行したのですがaccuracyやf1等のscoreがすべて同じ値になりました。これはどういう状況でしょうか。それとも現在組んでいるコードでは足りない箇所があるのでしょうか。
分かる方がいらしたら教えてください。
実際のコードが以下です

# -*- coding: utf-8 -*-

import scipy as sp
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier #RandomForest
from sklearn.svm import SVC # SVM用
import lightgbm as lgb
from sklearn.metrics import confusion_matrix  #混同行列
from sklearn.metrics import accuracy_score, precision_score #適合率
from sklearn.metrics import recall_score, f1_score #再現率,F1スコア
from sklearn.metrics import make_scorer


def SVM(X_train_std, X_test_std, Y_train, Y_test):
    model_SVM = SVC(kernel = "rbf", C = 763.8 , gamma = 0.0197 )
    #学習モデル構築。引数に訓練データの特徴量と、それに対応したラベル
    model_SVM.fit(X_train_std,Y_train)

    #予測したクラスラベル
    Y_pred = model_SVM.predict(X_test_std) 
    #print(Y_pred.shape)
    #print(Y_pred)
    #print(Y_test.shape)
    #print(Y_test)

    # .scoreで正解率を算出。
    print("\nSVM")    
    print("train score:",model_SVM.score(X_train_std,Y_train))
    print("test score:",model_SVM.score(X_test_std,Y_test))

    Y_test=Y_test.values


    print("accuracy score:",accuracy_score(Y_test, Y_pred))
    print("precision score:",precision_score(Y_test, Y_pred,average='micro'))
    print("recall score:",recall_score(Y_test, Y_pred,average='micro'))
    print("f1 score:",f1_score(Y_test, Y_pred,average='micro'))



def GBM(X_train, X_test, Y_train, Y_test):
    model_GBM = lgb.LGBMClassifier(boosting_type='gbdt', num_leaves=58, 
                                   max_depth=14, learning_rate=0.1, n_estimators=940, 
                                   min_child_samples=40, importance_type="split", random_state=0)

    #学習モデル構築。引数に訓練データの特徴量と、それに対応したラベル
    model_GBM.fit(X_train, Y_train)

    #予測したクラスラベル
    Y_pred = model_GBM.predict(X_test) 

    # .scoreで正解率を算出。
    print("\nGBM")    
    print("train score:",model_GBM.score(X_train,Y_train))
    print("test score:",model_GBM.score(X_test,Y_test))

    Y_test=Y_test.values

    print("accuracy score:",accuracy_score(Y_test, Y_pred))
    print("precision score:",precision_score(Y_test, Y_pred,average='micro'))
    print("recall score:",recall_score(Y_test, Y_pred,average='micro'))
    print("f1 score:",f1_score(Y_test, Y_pred,average='micro'))



def main():
    """
    TODO case_nameに任意の名前を指定
    フォルダを統一するために以降のscriptも名前を統一する
    """
    case_name = "case3"
    # ---------------------------------------

    case_dir = "./casestudy/{}/".format(case_name) 
    input_csv_name = "2_extracted_features_original.csv"
    input_csv_path = case_dir + input_csv_name
    input_df = pd.read_csv(input_csv_path, encoding="utf-8-sig")


    #すべてのデータを対象に分類を行う場合
    #-----------------------------------------------------------------------
    task = "all"
    train_df = input_df[input_df["train_test_flag"] == 0]
    test_df = input_df[input_df["train_test_flag"] == 1]
    # print(train_df)
    # print(test_df)

    X_train = train_df.loc[:, "contrast":"inverse_difference_m_norm"]
    X_test = test_df.loc[:, "contrast":"inverse_difference_m_norm"]
    # print(X_train)
    # print(X_test)
    Y_train = train_df["category"]
    Y_test = test_df["category"]
    # print(Y_train)

    sc = StandardScaler()
    sc.fit(X_train)
    X_train_std = sc.transform(X_train)
    X_test_std = sc.transform(X_test)
    # print(X_train_std)
    # print(X_test_std)
    # #------------------------------------------------------------------------
    SVM(X_train_std, X_test_std, Y_train, Y_test)
    GBM(X_train, X_test, Y_train, Y_test)


if __name__ == "__main__":
    main()


実際に出た結果がこちらです。

SVM
train score: 0.8728841145833334
test score: 0.771484375
accuracy score: 0.771484375
precision score: 0.771484375
recall score: 0.771484375
f1 score: 0.771484375

GBM
train score: 1.0
test score: 0.7096354166666666
accuracy score: 0.7096354166666666
precision score: 0.7096354166666666
recall score: 0.7096354166666666
f1 score: 0.7096354166666666
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

多クラス分類問題において、マイクロ平均による精度、適合率、再現率、F値はすべて同じ値になります。

機械学習 - 精度、適合率、再現率、F値について

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る