予測したy_predの値とブロック分けを行うための二つのリストから、ブロックごとの推定値を算出する。
この時、ブロックごとの推定値として、各時点の推定値(y_pred)の最頻値を用いている。
import numpy as np
from scipy.stats import mode
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.ensemble import RandomForestClassifier
def calculate_accuracy(y_true, y_pred):
return np.mean(y_true == y_pred)
def block_majority_vote(y_pred, begin_list, end_list):
block_predictions = [] # ブロックごとの予測を保存するリスト
for begin, end in zip(begin_list, end_list):
# ブロック内の予測を取得
block_pred = y_pred[begin:end+1]
# ブロック内の最頻値を計算
block_mode = mode(block_pred)[0][0]
block_predictions.append(block_mode)
return block_predictions
# サンプルデータ
y_pred = np.array([1, 2, 2, 1, 1, 3, 3, 3, 4, 4])
begin_list = [0, 3, 5]
end_list = [2, 4, 8]
y_test = np.array([1, 1, 2, 2, 1, 3, 3, 4, 4, 4])
# ブロックごとの最頻値を計算
block_pred = block_majority_vote(y_pred, begin_list, end_list)
block_test = block_majority_vote(y_test, begin_list, end_list)
# ブロックごとの精度を計算
accuracies = [calculate_accuracy(block_test[i], block_pred[i]) for i in range(len(begin_list))]
# 全体の精度を計算
overall_accuracy = calculate_accuracy(np.array(block_test).flatten(), np.array(block_pred).flatten())
# 混同行列を計算
confusion = confusion_matrix(np.array(block_test).flatten(), np.array(block_pred).flatten())
# ランダムフォレストを使って特徴量の重要度を計算(例)
X = np.random.rand(len(begin_list), 5) # ダミーデータ、実際のデータに置き換えてください
y = np.random.choice([0, 1], size=len(begin_list)) # ダミーデータ、実際のデータに置き換えてください
rf_clf = RandomForestClassifier(n_estimators=100)
rf_clf.fit(X, y)
feature_importance = rf_clf.feature_importances_
# 結果を表示
print(f"Overall Accuracy: {overall_accuracy:.2f}")
print("Confusion Matrix:")
print(confusion)
print("Feature Importance:")
print(feature_importance)