前提・実現したいこと
pythonを始めて一週間も満たない初心者です。
scikit-learnを用いてSVM(6つのパラメータから3つのクラス(0,2,3)に分類する)を行ったのち、
多クラス混同行列の作成と、評価指標4つ(正解率・再現率・適合率・F値)の算出をしたいと思い、
以下のプラグラムを作成しました。
SVMと行列の作成は正常に動作したのですが、評価指標の算出がどうもうまくできません。
具体的には、評価データと学習データ数が同じである場合は、評価指標4つが問題なく算出されるのですが、
評価データと学習データの個数が異なった場合にいくつかのエラーがでて計算できません。
自分なりにいろいろ調べ、改善を試みましたが、力不足で対処することができませんでした。
とても初歩的な問題なのかもしれませんが、ご指導いただけますでしょうか。
よろしくお願いします。
該当のソースコード
import numpy as np
from sklearn import metrics
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
//# ファイルからデータ読み込み
import pandas as pd
Data1 = pd.read_csv('test.csv')
//# 説明変数と目的変数を分離
X = Data1.loc[:,["p1","p2","p3","p4","p5","p6"]]
y= Data1.loc[:,"class"]
//# 評価データと学習データに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25,shuffle=False)
print('評価データ数:',len(y_test))
print('学習データ数:',len(y_train))
//# SVM
best_gamma = 0.1
best_C = 0.01
from sklearn import svm
clf = svm.SVC(C=best_C, gamma=best_gamma)
clf.fit(X_train, y_train)
pre = clf.predict(X_test)
print("")
print('<予測データ>')
result = pd.DataFrame({"true":y_test, "pred":pre})
print(result)
ac_score = metrics.accuracy_score(y_test, pre)
print(' ({:.1f}%)'.format(ac_score*100))
print("")
print(confusion_matrix(y_test, pre))
//# 評価指標の算出
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
from sklearn.metrics import f1_score
acc_score = accuracy_score(y_train, pre)
rec_score = recall_score(y_train, pre, average="macro")
pre_score = precision_score(y_train, pre, average="macro")
f1_score = f1_score(y_train, pre, average="macro")
print("")
print('正解率: {:.2f}'.format(acc_score))
print('再現率: {:.2f}'.format(rec_score))
print('適合率: {:.2f}'.format(pre_score))
print('F1値 : {:.2f}'.format(f1_score))
###発生している問題・エラーメッセージ
ValueError Traceback (most recent call last)
<ipython-input-2-47642e7d9cb4> in <module>
44 from sklearn.metrics import f1_score
45
---> 46 acc_score = accuracy_score(y_train, pre)
47 rec_score = recall_score(y_train, pre, average="macro")
48 pre_score = precision_score(y_train, pre, average="macro")
~\Anaconda3\lib\site-packages\sklearn\metrics\classification.py in accuracy_score(y_true, y_pred, normalize, sample_weight)
174
175 # Compute accuracy for each possible representation
--> 176 y_type, y_true, y_pred = _check_targets(y_true, y_pred)
177 check_consistent_length(y_true, y_pred, sample_weight)
178 if y_type.startswith('multilabel'):
~\Anaconda3\lib\site-packages\sklearn\metrics\classification.py in _check_targets(y_true, y_pred)
69 y_pred : array or indicator matrix
70 """
---> 71 check_consistent_length(y_true, y_pred)
72 type_true = type_of_target(y_true)
73 type_pred = type_of_target(y_pred)
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_consistent_length(*arrays)
203 if len(uniques) > 1:
204 raise ValueError("Found input variables with inconsistent numbers of"
--> 205 " samples: %r" % [int(l) for l in lengths])
206
207
ValueError: Found input variables with inconsistent numbers of samples: [81, 27]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 07:44