👩‍💻

言語処理100本ノック 2020 (Rev 2) 第6章: 機械学習 55. 混同行列の作成

2023/01/14に公開約3,500字

問題

55. 混同行列の作成

52で学習したロジスティック回帰モデルの混同行列(confusion matrix)を,学習データおよび評価データ上で作成せよ.

solution55.py
import pandas as pd
import numpy as np
import re
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

def preprocessing(data):
    x = []
    y = []
    label = {"b":0, "e":1, "t":2, "m":3}

    for title, category in data:
        title = re.sub("[0-9]+", "0", title)
        x.append(title.lower())
        y.append(label[category])

    return x,y

def score(model, X):
    pred = model.predict([X])
    pred_proba = model.predict_proba([X])[0, pred]
    return pred[0], pred_proba[0]

np.random.seed(123)
df = pd.read_csv("chapter06/NewsAggregatorDataset/newsCorpora.csv", header=None, sep="\t", names=["ID", "TITLE", "URL", "PUBLISHER", "CATEGORY", "STORY", "HOSTNAME", "TIMESTAMP"])
df = df.loc[df["PUBLISHER"].isin(["Reuters", "Huffington Post", "Businessweek", "Contactmusic.com", "Daily Mail"]), ["TITLE", "CATEGORY"]]

train, valid_test = train_test_split(df, test_size=0.2, shuffle=True)
valid, test = train_test_split(valid_test, test_size=0.5, shuffle=True)

train = np.array(train)
valid = np.array(valid)
test = np.array(test)

X_train, Y_train = preprocessing(train)
X_valid, Y_valid = preprocessing(valid)
X_test, Y_test = preprocessing(test)

tfidfvectorizer = TfidfVectorizer(min_df=0.001)

X_train = tfidfvectorizer.fit_transform(X_train).toarray()
X_valid = tfidfvectorizer.transform(X_valid).toarray()
X_test = tfidfvectorizer.transform(X_test).toarray()

model = LogisticRegression()
model.fit(X_train, Y_train)

train_pred = []
test_pred = []

for X in X_train:
    train_pred.append(score(model, X)[0])

for X in X_test:
    test_pred.append(score(model, X)[0])

train_matrix = confusion_matrix(Y_train, train_pred)
sns.heatmap(train_matrix, annot=True, cmap="hot_r")
plt.show()

test_matrix = confusion_matrix(Y_test, test_pred)
sns.heatmap(test_matrix, annot=True, cmap="hot_r")
plt.show()

output

output

この問題では、ロジスティック回帰モデルが学習データとテストデータに対してどの程度の混同行列を示すかを可視化します。confusion_matrix関数を使用して、学習データとテストデータの混同行列を計算します。seabornheatmap関数を使用して、混同行列を可視化します。matplotlibshow関数を使用して、グラフを表示します。これにより、ロジスティック回帰モデルが学習データとテストデータ上で、どの程度の混同が発生しているかを知ることができます。

https://github.com/kurokawa5/nlp100_2020/blob/main/chapter06/solution55.py

参考記事

第6章: 機械学習
pandas.DataFrameの行を条件で抽出するquery
scikit-learnでデータを訓練用とテスト用に分割するtrain_test_split
Numpy で乱数を生成する
sklearn.feature_extraction.text.TfidfVectorizer
sklearn.linear_model.LogisticRegression
scikit-learnで混同行列を生成、適合率・再現率・F1値などを算出
Seaborn でヒートマップを作成する

Discussion

ログインするとコメントできます