「リングフィットアドベンチャー」をクリアした
2月末ごろに完全在宅勤務に移行した後に購入した「リングフィットアドベンチャー」を(一旦)クリアしました。
なんか運よく調達できた💪(switchがまだ無い) pic.twitter.com/idv0Dk4rmv
— u++ (@upura0) March 11, 2020
リングフィットアドベンチャーとは?
端的に言うと、筋トレRPGです。任天堂から2019年10月18日に発売されたNintendo Switch専用ソフトです。主人公になりきってステージを駆け巡り、フィットネスを通じて敵にダメージを与えます。
買ってどうだった?
リングフィットアドベンチャーとの出会いは、2019年12月の「Kaggle Days Tokyo」*1でした(?)。
#kaggledaystokyo pic.twitter.com/oWx4aPqddJ
— onodera (@0verfit) December 11, 2019
Kaggle Night Tokyo、めちゃくちゃ楽しかった
— u++ (@upura0) December 12, 2019
非常に楽しいことは認知しており、今回の外出自粛の状況をきっかけに購入に至りました。
今なお続く在宅勤務中に買ったものは多い*2ですが、その中でも指折りの満足度と言えるでしょう。中盤あたりはストーリーの単調さに若干飽きましたが、筋トレにゲーム性を織り交ぜた構成で日々の運動習慣の継続に寄与しました。
リングフィットアドベンチャー、主人公が毎回ドラゴを取り逃がすの意味わからなくなってきた
— u++ (@upura0) April 10, 2020
4月からは動画配信サービス「TELASA」で『相棒』や『劇場版名探偵コナン』全シリーズを制覇していました*3が、そのお供になっていたのはリングフィットアドベンチャーでした。
「相棒」見ながらリングフィットアドベンチャー のジョギングモードやってたら3話経過してた
— u++ (@upura0) May 16, 2020
あいにくのコロナ禍は、なかなか収まる気配を見せません。そんな状況下で、自宅で地道に取り組めるものを見つけられたのは良かったのかなと思っています。クリア後もまだまだお楽しみ要素があるようなので、引き続き筋トレを続けていきたいです。
なんだかんだ続けられたし、成長を感じた #リングフィットアドベンチャー #RingFitAdventure #NintendoSwitch pic.twitter.com/FvQ7SzK9M2
— u++ (@upura0) July 26, 2020
言語処理100本ノック 2020「59. ハイパーパラメータの探索」
問題文
問題の概要
学習アルゴリズムとして「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. 正則化パラメータの変更」
問題文
問題の概要
学習時の「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')
言語処理100本ノック 2020「57. 特徴量の重みの確認」
問題文
問題の概要
ロジスティック回帰を用いた場合は「.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スコアの計測」
問題文
問題の概要
適合率,再現率,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. 混同行列の作成」
問題文
問題の概要
混同行列は「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. 正解率の計測」
問題文
問題の概要
正答率は「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))}')