u++の備忘録

「リングフィットアドベンチャー」をクリアした

2月末ごろに完全在宅勤務に移行した後に購入した「リングフィットアドベンチャー」を(一旦)クリアしました。

リングフィットアドベンチャーとは?

端的に言うと、筋トレRPGです。任天堂から2019年10月18日に発売されたNintendo Switch専用ソフトです。主人公になりきってステージを駆け巡り、フィットネスを通じて敵にダメージを与えます。

www.nintendo.co.jp

買ってどうだった?

リングフィットアドベンチャーとの出会いは、2019年12月の「Kaggle Days Tokyo」*1でした(?)。

非常に楽しいことは認知しており、今回の外出自粛の状況をきっかけに購入に至りました。

今なお続く在宅勤務中に買ったものは多い*2ですが、その中でも指折りの満足度と言えるでしょう。中盤あたりはストーリーの単調さに若干飽きましたが、筋トレにゲーム性を織り交ぜた構成で日々の運動習慣の継続に寄与しました。

4月からは動画配信サービス「TELASA」で『相棒』や『劇場版名探偵コナン』全シリーズを制覇していました*3が、そのお供になっていたのはリングフィットアドベンチャーでした。

あいにくのコロナ禍は、なかなか収まる気配を見せません。そんな状況下で、自宅で地道に取り組めるものを見つけられたのは良かったのかなと思っています。クリア後もまだまだお楽しみ要素があるようなので、引き続き筋トレを続けていきたいです。

*1:kaggledays.com

*2:なお未だに給付金の申請書は面倒くさくて書いていない

*3:upura.hatenablog.com

言語処理100本ノック 2020「59. ハイパーパラメータの探索」

問題文

nlp100.github.io

問題の概要

学習アルゴリズムとして「RandomForestClassifier()」も利用し「max_depth」の値を調整します。

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score


X_train = pd.read_table('ch06/train.feature.txt', header=None)
X_valid = pd.read_table('ch06/valid.feature.txt', header=None)
X_test = pd.read_table('ch06/test.feature.txt', header=None)
y_train = pd.read_table('ch06/train.txt', header=None)[1]
y_valid = pd.read_table('ch06/valid.txt', header=None)[1]
y_test = pd.read_table('ch06/test.txt', header=None)[1]

test_acc = []

C_candidate = [0.1, 1.0, 10, 100]
for c in C_candidate:
    clf = LogisticRegression(penalty='l2', solver='sag', random_state=0, C=c)
    clf.fit(X_train, y_train)
    test_acc.append(accuracy_score(y_test, clf.predict(X_test)))


max_depth_candidate = [2, 4, 8, 16]
for m in max_depth_candidate:
    clf = RandomForestClassifier(max_depth=m, random_state=0)
    clf.fit(X_train, y_train)
    test_acc.append(accuracy_score(y_test, clf.predict(X_test)))

bestIndex = test_acc.index(max(test_acc))
if bestIndex < 4:
    bestAlg = 'LogisticRegression'
    bestParam = f'C={C_candidate[bestIndex]}'
else:
    bestAlg = 'RandomForestClassifier'
    bestParam = f'max_depth={max_depth_candidate[bestIndex - 4]}'

print(bestAlg, bestParam)

言語処理100本ノック 2020「58. 正則化パラメータの変更」

問題文

nlp100.github.io

問題の概要

学習時の「C」の値を調整することで、学習・予測結果が変わります。

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


X_train = pd.read_table('ch06/train.feature.txt', header=None)
X_valid = pd.read_table('ch06/valid.feature.txt', header=None)
X_test = pd.read_table('ch06/test.feature.txt', header=None)
y_train = pd.read_table('ch06/train.txt', header=None)[1]
y_valid = pd.read_table('ch06/valid.txt', header=None)[1]
y_test = pd.read_table('ch06/test.txt', header=None)[1]

C_candidate = [0.1, 1.0, 10, 100]
train_acc = []
valid_acc = []
test_acc = []

for c in C_candidate:
    clf = LogisticRegression(penalty='l2', solver='sag', random_state=0, C=c)
    clf.fit(X_train, y_train)
    train_acc.append(accuracy_score(y_train, clf.predict(X_train)))
    valid_acc.append(accuracy_score(y_valid, clf.predict(X_valid)))
    test_acc.append(accuracy_score(y_test, clf.predict(X_test)))

plt.plot(C_candidate, train_acc, label='train acc')
plt.plot(C_candidate, valid_acc, label='valid acc')
plt.plot(C_candidate, test_acc, label='test acc')
plt.legend()
plt.savefig('ch06/ans58.png')

f:id:upura:20200726004359p:plain

言語処理100本ノック 2020「57. 特徴量の重みの確認」

問題文

nlp100.github.io

問題の概要

ロジスティック回帰を用いた場合は「.coef_」で特徴量の重みを確認できます。今回は値の絶対値に興味があるので、事前にソートした上で上位・下位10個の特徴量を出力します。

import joblib


clf = joblib.load('ch06/model.joblib')
vocabulary_ = joblib.load('ch06/vocabulary_.joblib')
coefs = clf.coef_

for c in coefs:
    d = dict(zip(vocabulary_, c))
    d_top = sorted(d.items(), key=lambda x: abs(x[1]), reverse=True)[:10]
    print(d_top)
    d_bottom = sorted(d.items(), key=lambda x: abs(x[1]), reverse=False)[:10]
    print(d_bottom)

言語処理100本ノック 2020「56. 適合率,再現率,F1スコアの計測」

問題文

nlp100.github.io

問題の概要

適合率,再現率,F1スコアはそれぞれ「precision_score()」「recall_score()」「f1_score()」で計算できます。「average」には「'micro'」「'macro'」などが指定可能*1です。

import pandas as pd
import joblib
from sklearn.metrics import recall_score, precision_score, f1_score


X_train = pd.read_table('ch06/train.feature.txt', header=None)
X_test = pd.read_table('ch06/test.feature.txt', header=None)
y_train = pd.read_table('ch06/train.txt', header=None)[1]
y_test = pd.read_table('ch06/test.txt', header=None)[1]

clf = joblib.load('ch06/model.joblib')
y_pred = clf.predict(X_test)

print(f'test recall of None: {recall_score(y_test, y_pred, average=None)}')
print(f'test recall of micro: {recall_score(y_test, y_pred, average="micro")}')
print(f'test recall of macro: {recall_score(y_test, y_pred, average="macro")}')
print(f'test precision of None: {precision_score(y_test, y_pred, average=None)}')
print(f'test precision of micro: {precision_score(y_test, y_pred, average="micro")}')
print(f'test precision of macro: {precision_score(y_test, y_pred, average="macro")}')
print(f'test f1 of None: {f1_score(y_test, y_pred, average=None)}')
print(f'test f1 of micro: {f1_score(y_test, y_pred, average="micro")}')
print(f'test f1 of macro: {f1_score(y_test, y_pred, average="macro")}')

言語処理100本ノック 2020「55. 混同行列の作成」

問題文

nlp100.github.io

問題の概要

混同行列は「confusion_matrix()」で作成できます。

import pandas as pd
import joblib
from sklearn.metrics import confusion_matrix


X_train = pd.read_table('ch06/train.feature.txt', header=None)
X_test = pd.read_table('ch06/test.feature.txt', header=None)
y_train = pd.read_table('ch06/train.txt', header=None)[1]
y_test = pd.read_table('ch06/test.txt', header=None)[1]

clf = joblib.load('ch06/model.joblib')

print(f'train confusion matrix:\n {confusion_matrix(y_train, clf.predict(X_train))}')
print(f'test confusion matrix:\n {confusion_matrix(y_test, clf.predict(X_test))}')

言語処理100本ノック 2020「54. 正解率の計測」

問題文

nlp100.github.io

問題の概要

正答率は「accuracy_score()」で計算できます。

import pandas as pd
import joblib
from sklearn.metrics import accuracy_score


X_train = pd.read_table('ch06/train.feature.txt', header=None)
X_test = pd.read_table('ch06/test.feature.txt', header=None)
y_train = pd.read_table('ch06/train.txt', header=None)[1]
y_test = pd.read_table('ch06/test.txt', header=None)[1]

clf = joblib.load('ch06/model.joblib')

print(f'train acc: {accuracy_score(y_train, clf.predict(X_train))}')
print(f'test acc: {accuracy_score(y_test, clf.predict(X_test))}')