{ "cells": [ { "cell_type": "markdown", "id": "92746262", "metadata": {}, "source": [ "# 感情分析" ] }, { "cell_type": "markdown", "id": "7ec44e6a", "metadata": {}, "source": [ "## タスク設定\n", "\n", "宿に関するレビューに関して、次を行うモデルを開発します。\n", "\n", "* レビューの中からなるべく多くのネガティブな意見を把握する\n", "* 何件レビューが来るかわからないため、現時点で全件チェックできるかわからない。従って、信頼度が大きいものから順になるべく効率的にネガティブな意見を把握する\n", "\n", "## 評価方法\n", "\n", "タスク設定を考えると、Recallを主にした評価が適切そうです。\n", "\n", "信頼度が大きいものから順になるべく効率的にネガティブな意見を把握したいということなので、\n", "学習時にはPrecision-Recallカーブの下の面積であるAverage Precisionを最大化するように学習し、\n", "最終的なレポート時には\n", "「recall 80%のもとでprecisionが~%」のような表現にする方針がよさそうです。" ] }, { "cell_type": "markdown", "id": "b8a621dd", "metadata": {}, "source": [ "## データ作成\n", "\n", "ここでは、JRTEコーパスを利用します。" ] }, { "cell_type": "markdown", "id": "e0d41bb8", "metadata": {}, "source": [ "## アノテーション結果の検証\n", "\n", "アノテーション結果の検証については\n", "[アノテーション結果の検証](annotation.ipynb)\n", "に詳しく書いていますので、そちらを確認してください。\n", "\n", "今回は最終的にジャッジが一致しているデータを利用することにします。" ] }, { "cell_type": "code", "execution_count": 1, "id": "8adb4496", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "data = pd.read_csv(\"input/pn_same_judge.csv\")" ] }, { "cell_type": "markdown", "id": "38288ac5", "metadata": {}, "source": [ "## データの概要把握" ] }, { "cell_type": "code", "execution_count": 2, "id": "286e53da", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
labeltextjudges
0neutral出張でお世話になりました。{\"0\": 3}
1neutral朝食は普通でした。{\"0\": 3}
2positiveまた是非行きたいです。{\"1\": 3}
3positiveまた利用したいと思えるホテルでした。{\"1\": 3}
4neutral新婚旅行で利用しました。{\"0\": 3}
\n", "
" ], "text/plain": [ " label text judges\n", "0 neutral 出張でお世話になりました。 {\"0\": 3}\n", "1 neutral 朝食は普通でした。 {\"0\": 3}\n", "2 positive また是非行きたいです。 {\"1\": 3}\n", "3 positive また利用したいと思えるホテルでした。 {\"1\": 3}\n", "4 neutral 新婚旅行で利用しました。 {\"0\": 3}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "id": "b3442dd1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4186, 3)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "code", "execution_count": 4, "id": "efe880e5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 4186 entries, 0 to 4185\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 label 4186 non-null object\n", " 1 text 4186 non-null object\n", " 2 judges 4186 non-null object\n", "dtypes: object(3)\n", "memory usage: 98.2+ KB\n" ] } ], "source": [ "data.info()" ] }, { "cell_type": "code", "execution_count": 5, "id": "164d852a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "label 0\n", "text 0\n", "judges 0\n", "dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 欠損値がないことを確認\n", "data.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 6, "id": "13522c2f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countuniquetopfreq
label41863positive2835
text41864186出張でお世話になりました。1
judges41863{\"1\": 3}2835
\n", "
" ], "text/plain": [ " count unique top freq\n", "label 4186 3 positive 2835\n", "text 4186 4186 出張でお世話になりました。 1\n", "judges 4186 3 {\"1\": 3} 2835" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ユニークな値を確認\n", "data.describe(include=[object]).T" ] }, { "cell_type": "code", "execution_count": 7, "id": "898ffc3b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countuniquetopfreq
label41863positive2835
text41864186出張でお世話になりました。1
judges41863{\"1\": 3}2835
\n", "
" ], "text/plain": [ " count unique top freq\n", "label 4186 3 positive 2835\n", "text 4186 4186 出張でお世話になりました。 1\n", "judges 4186 3 {\"1\": 3} 2835" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe().T" ] }, { "cell_type": "code", "execution_count": 8, "id": "a4c2eee2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "positive 2835\n", "neutral 749\n", "negative 602\n", "Name: label, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[\"label\"].value_counts()" ] }, { "cell_type": "markdown", "id": "71e869c6", "metadata": {}, "source": [ "最後に学習用に数字のラベルも付与しておきましょう。\n", "ネガティブな意見を抽出したいので、negativeラベルに1を、その他のラベルpositive, neutralには0を付与しておきます。" ] }, { "cell_type": "code", "execution_count": 9, "id": "6856d278", "metadata": {}, "outputs": [], "source": [ "data[\"label_num\"] = data[\"label\"].map({\"positive\": 0, \"neutral\": 0, \"negative\": 1})" ] }, { "cell_type": "code", "execution_count": 59, "id": "8a34934e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
labeltextjudges
countuniquetopfreqcountuniquetopfreqcountuniquetopfreq
label_num
035842positive283535843584出張でお世話になりました。135842{\"1\": 3}2835
16021negative602602602期待していただけに残念でした。16021{\"-1\": 3}602
\n", "
" ], "text/plain": [ " label text \\\n", " count unique top freq count unique top freq \n", "label_num \n", "0 3584 2 positive 2835 3584 3584 出張でお世話になりました。 1 \n", "1 602 1 negative 602 602 602 期待していただけに残念でした。 1 \n", "\n", " judges \n", " count unique top freq \n", "label_num \n", "0 3584 2 {\"1\": 3} 2835 \n", "1 602 1 {\"-1\": 3} 602 " ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.groupby(\"label_num\").describe()" ] }, { "cell_type": "markdown", "id": "a14e6fc5", "metadata": {}, "source": [ "## データの分割\n", "\n", "テストデータの内容は確認したいことが重要なので、探索的データ分析をする前に分割しておきましょう。\n", "\n", "positiveとneutralは共に負例として扱いますが、分布自体は保っておきたいため `stratify` 引数には\n", "`data[\"label_num\"]` では **なく** `data[\"label\"]` を指定していることに注意してください。" ] }, { "cell_type": "code", "execution_count": 12, "id": "104b8a83", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "train, test = train_test_split(data, test_size=0.1, random_state=0, stratify=data[\"label\"])" ] }, { "cell_type": "code", "execution_count": 13, "id": "2ca5e42c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((3767, 4), (419, 4))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.shape, test.shape" ] }, { "cell_type": "markdown", "id": "2a2354a4", "metadata": {}, "source": [ "## ベースラインモデルの構築\n", "\n", "まずは簡単なモデルを作成し、どの程度の精度ができるのかを確かめてみましょう。\n", "\n", "ここでは、次のモデルを学習してCVで結果を比較します。\n", "\n", "* Naive Bayes\n", "* Logistic Regression\n", "* SVM\n", "* Random Forest\n", "\n", "ベクトル化にはTfidfVectorizerを利用することにします。" ] }, { "cell_type": "code", "execution_count": 15, "id": "17c019ff", "metadata": {}, "outputs": [], "source": [ "from sklearn.naive_bayes import MultinomialNB\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.svm import SVC\n", "from sklearn.ensemble import RandomForestClassifier\n", "\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.feature_extraction.text import TfidfVectorizer" ] }, { "cell_type": "markdown", "id": "00e791f3", "metadata": {}, "source": [ "結果のPRカーブを書くためには各フォールドのprediction結果を保持しておく必要があります。\n", "そこで、GridSearchCVではなくParameterGridを使ってカスタムでループを回します。" ] }, { "cell_type": "code", "execution_count": 19, "id": "a098b537", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import ParameterGrid\n", "import numpy as np\n", "\n", "\n", "def run_cv(pipe, params, cv, X, y, stratify):\n", " result = []\n", " for param in ParameterGrid(params):\n", " pipe.set_params(**param)\n", " print(pipe)\n", " pred = np.zeros((len(X), ))\n", " for fold_id, (train_idx, test_idx) in enumerate(cv.split(X=X, y=stratify)):\n", " print(\"Fold:\", fold_id)\n", " \n", " # neutralもstratifyするためにここでmapを行う\n", " pipe.fit(X=X.iloc[train_idx], y=y.iloc[train_idx])\n", " try:\n", " pred[test_idx] = pipe.predict_proba(X.iloc[test_idx])[:,1]\n", " except AttributeError:\n", " # For SVM\n", " pred[test_idx] = pipe.decision_function(X.iloc[test_idx])\n", "\n", " result.append((param, pred))\n", " return result" ] }, { "cell_type": "markdown", "id": "42cd5644", "metadata": {}, "source": [ "トークナイザを定義します。" ] }, { "cell_type": "code", "execution_count": 20, "id": "903a64fb", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-05-09 05:54:09.828683: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", "2022-05-09 05:54:09.828770: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] } ], "source": [ "import spacy\n", "\n", "nlp = spacy.load(\"ja_core_news_sm\")\n", "\n", "\n", "def tokenize(text, stopwords=set()):\n", " return [t.lemma_ for t in nlp(text) if t.lemma_ not in stopwords]" ] }, { "cell_type": "markdown", "id": "7da53770", "metadata": {}, "source": [ "クロスバリデーションの設定をします。\n", "\n", "今回はデータが少ないので、フォールドごとにテストデータが少なくなってしまうのをさけるために\n", "フォールド数は小さめに 3 に設定することにします。" ] }, { "cell_type": "code", "execution_count": 23, "id": "5f25d219", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import StratifiedKFold\n", "\n", "cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=0)" ] }, { "cell_type": "code", "execution_count": 24, "id": "84291046", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', MultinomialNB())])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n", "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', LogisticRegression(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n", "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n", "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', RandomForestClassifier(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n" ] } ], "source": [ "pipe = Pipeline([\n", " (\"vect\", TfidfVectorizer(tokenizer=tokenize)),\n", " (\"clf\", MultinomialNB())\n", "])\n", "\n", "params = [\n", " {\n", " \"clf\": [\n", " MultinomialNB(),\n", " LogisticRegression(random_state=0),\n", " SVC(random_state=0),\n", " RandomForestClassifier(random_state=0)\n", " ],\n", " },\n", "]\n", "\n", "# ここでも neutral と positive の分布を保つために\n", "# stratify には train[\"label_num\"] ではなく train[\"label\"]を渡していることに注意\n", "result = run_cv(pipe=pipe, params=params, cv=cv, X=train[\"text\"], y=train[\"label_num\"], stratify=train[\"label\"])" ] }, { "cell_type": "markdown", "id": "39fc801c", "metadata": {}, "source": [ "結果を描画します。" ] }, { "cell_type": "code", "execution_count": 25, "id": "65627e75", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from sklearn.metrics import PrecisionRecallDisplay\n", "\n", "def show_pr(result, y):\n", " \"\"\"run_cvの結果からPRカーブを描画する関数\"\"\"\n", " _, ax = plt.subplots(figsize=(10, 5))\n", " for model_id, (param, pred) in enumerate(result):\n", " print(model_id, param)\n", " PrecisionRecallDisplay.from_predictions(ax=ax, y_true=y, y_pred=pred, name=f\"Model-{model_id}\")" ] }, { "cell_type": "code", "execution_count": 26, "id": "bb876caa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 {'clf': MultinomialNB()}\n", "1 {'clf': LogisticRegression(random_state=0)}\n", "2 {'clf': SVC(random_state=0)}\n", "3 {'clf': RandomForestClassifier(random_state=0)}\n" ] }, { "data": { "image/png": "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+5aYgl24cCFvv/02OTk59O7dm/fff79E4lTa8uXLmT59Okop+vTpw6VLlzh37hx+fn4lxn399dd88803ps/Hjx8nLS2N999/nxdffJG77767zLldXV3p0aMHx44do3v37lX+WVQW44YNGwC48847GTJkCK+88kqF45csWcKYMWNwcTH6i+Xn5/OPf/yDb775hh9//NE0zsXFhaCgIP766y969ep11fEJIYSwnr1zRjHhva24Odrh6mjL2kNxALy/4TiPDGtb9QnajICnzsN7veFSDBTkV32MFclMWDW65ZZbWLx4MVlZWURGRtK7d2/Tvjlz5tCtWzciIyN56aWXmD7deLJj3rx5DBgwgAMHDjBx4kROnToFwKFDh/j222/ZunUrERER2Nra8vXXX1d6/djYWFq0uNxBPiAggNjYkg1Rc3JyOHHiBEFBQaZtixcv5pZbbmHgwIEcPnyYCxculDl3QkIC27dvp1OnksloampqiVuHxV8HDx4sc54LFy6YksJmzZqVe63iFi9ezLRp00yf3333XcaPH18msQQIDw83Jb1CCCHqHhsbxc+PDmDR/X345M6eRM8fy139grCzuYIHrOydIXyG5YKsRvVuJsycGStLCQ0NJTo6mkWLFnH99deX2LdlyxZ++OEHAIYNG0ZCQgIpKSls2rTJdAtw7NixeHt7A7Bu3Tp27dpFz55GFeHMzEx8fX2vOcb4+Hi8vLxKbFu0aBE//vgjNjY23HTTTXz//fc88sgjAGzevJlu3bphY2PD7NmzyyRh7u7uREREXFUsSqlKn1w8d+4c+/bt47rrrgPg7NmzfP/996aZtNJ8fX2JKmzuKoQQov7LioqCB/7BnPg81u2ZTY8XeuDv5m/tsMxW75Iwaxs/fjyzZs1iw4YNJCQkXPV5tNbceeedvPzyyxWOee+99/j4448BWLVqFc2bN+f06dOm/WfOnCmzLs3Z2blEZ4F9+/Zx9OhRRo4cCRgzZcHBwaYkbODAgaxYsaLCGFJTUxk4cGC5+7755hs6duxYYlvTpk1Nt0jPnTtXaWL53XffMXHiRFOl+z179nDs2DHatGkDQEZGBm3atOHYsWOAUS/O2dm5wvMJIYSoey5l5JCSlcd3O04zqlNTvFwcAKNcBYBG0yrOBijguh+uY3jgcF61a0FdKN8qtyOr2YwZM5gzZw5dunQpsX3g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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "show_pr(result=result, y=train[\"label_num\"])" ] }, { "cell_type": "markdown", "id": "e7f7b867", "metadata": {}, "source": [ "SVCの結果が良好ですので、ここではベースラインとしてSVCを使うことにします。" ] }, { "cell_type": "markdown", "id": "f785b829", "metadata": {}, "source": [ "## モデルの改良" ] }, { "cell_type": "markdown", "id": "09e4dd4a", "metadata": {}, "source": [ "### 探索的データ分析\n", "\n", "探索的データ分析では、データを観察し分類に寄与しそうな仮説を探します。\n", "\n", "ここでは、\n", "BoWの次元は大きくなりやすく次元の呪いの問題を受けやすい問題に対して、\n", "ストップワードを取り入れて分類に寄与しそうにない単語は取り除いて\n", "精度が向上するかをみてみることにします。" ] }, { "cell_type": "markdown", "id": "5907e35a", "metadata": {}, "source": [ "まずはラベル毎に単語を頻度が大きい順にいくつか出力してみます。" ] }, { "cell_type": "code", "execution_count": 32, "id": "3177f04f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\ndef show_most_frequent_words(df, tokenize, stopwords=set(), top_n=50):\\n for label in df[\"label\"].unique():\\n print(f\"label: {label}, top-{top_n} most frequent word\")\\n pos_words = count_words(df.query(\\'label == @label\\'), tokenize=tokenize)\\n print(pd.Series(pos_words).sort_values(ascending=False).iloc[:top_n])\\n'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter\n", "\n", "\n", "def count_words(sr, tokenize):\n", " cnt = Counter()\n", " for words in sr.apply(lambda sent: tokenize(sent)):\n", " cnt.update(words)\n", " return cnt\n", "\n", "\n", "\"\"\"\n", "def show_most_frequent_words(df, tokenize, stopwords=set(), top_n=50):\n", " for label in df[\"label\"].unique():\n", " print(f\"label: {label}, top-{top_n} most frequent word\")\n", " pos_words = count_words(df.query('label == @label'), tokenize=tokenize)\n", " print(pd.Series(pos_words).sort_values(ascending=False).iloc[:top_n])\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 37, "id": "c8362df0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('。', 488),\n", " ('が', 443),\n", " ('の', 437),\n", " ('た', 408),\n", " ('、', 277),\n", " ('です', 244),\n", " ('に', 226),\n", " ('は', 204),\n", " ('て', 201),\n", " ('ます', 196),\n", " ('だ', 182),\n", " ('と', 161),\n", " ('する', 145),\n", " ('ない', 107),\n", " ('も', 98),\n", " ('残念', 91),\n", " ('を', 82),\n", " ('か', 79),\n", " ('部屋', 76),\n", " ('で', 73),\n", " ('ある', 72),\n", " ('いる', 59),\n", " ('ぬ', 58),\n", " ('お', 56),\n", " ('風呂', 53),\n", " ('.', 47),\n", " ('ただ', 40),\n", " ('思う', 39),\n", " ('なる', 39),\n", " ('少し', 38),\n", " ('狭い', 33),\n", " ('れる', 30),\n", " ('朝食', 30),\n", " ('?', 29),\n", " ('から', 27),\n", " ('・', 26),\n", " ('てる', 25),\n", " ('時', 25),\n", " ('悪い', 25),\n", " ('ちょっと', 24),\n", " ('気', 24),\n", " ('方', 20),\n", " ('こと', 19),\n", " ('な', 19),\n", " ('フロント', 18),\n", " ('人', 17),\n", " ('良い', 17),\n", " ('掃除', 17),\n", " ('入る', 17),\n", " ('(', 16)]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cnt_1 = count_words(train.query('label_num == 1')[\"text\"], tokenize=tokenize)\n", "cnt_1.most_common(n=50)" ] }, { "cell_type": "code", "execution_count": 38, "id": "3448401e", "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "[('。', 2928),\n", " ('た', 2324),\n", " ('です', 1605),\n", " ('ます', 1299),\n", " ('の', 1261),\n", " ('も', 1108),\n", " ('て', 813),\n", " ('が', 798),\n", " ('だ', 757),\n", " ('する', 722),\n", " ('は', 716),\n", " ('に', 705),\n", " ('、', 701),\n", " ('で', 475),\n", " ('と', 447),\n", " ('良い', 417),\n", " ('お', 384),\n", " ('を', 334),\n", " ('部屋', 297),\n", " ('利用', 290),\n", " ('ある', 268),\n", " ('とても', 228),\n", " ('美味しい', 202),\n", " ('ホテル', 193),\n", " ('また', 191),\n", " ('満足', 183),\n", " ('いる', 182),\n", " ('思う', 179),\n", " ('!', 178),\n", " ('風呂', 173),\n", " ('たい', 169),\n", " ('朝食', 167),\n", " ('から', 141),\n", " ('できる', 126),\n", " ('最高', 123),\n", " ('対応', 108),\n", " ('広い', 108),\n", " ('大', 105),\n", " ('なる', 104),\n", " ('こと', 102),\n", " ('行く', 101),\n", " ('ない', 101),\n", " ('綺麗', 96),\n", " ('よい', 96),\n", " ('いただく', 91),\n", " ('せる', 89),\n", " ('温泉', 88),\n", " ('方', 80),\n", " ('清潔', 79),\n", " ('か', 78)]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cnt_0 = count_words(train.query('label_num == 0')[\"text\"], tokenize=tokenize)\n", "cnt_0.most_common(n=50)" ] }, { "cell_type": "markdown", "id": "834eff21", "metadata": {}, "source": [ "この結果をみながらストップワードを定義してみましょう。\n", "\n", "```{note}\n", "問題によってストップワードが何かという基準は変わってきます。\n", "やみくもに公開されているストップワード辞書を使うのではなく、データを見てストップワードを決めましょう。\n", "```\n", "\n", "一方のラベルにのみ頻繁に出現しているような、各ラベルで特徴的な単語は残し、それ以外は除去を行います。\n", "ここでは次のようにストップワードを定義してみます。" ] }, { "cell_type": "code", "execution_count": 53, "id": "87341af5", "metadata": { "scrolled": false }, "outputs": [], "source": [ "stopwords = {\n", " \"。\", \"、\", \"!\", \"!\", \"?\", \"(\", \")\", \"(\", \")\",\n", " \"です\", \"ます\", \"する\", \"なる\", \"ある\", \"いる\",\n", " \"れる\", \"いう\", \"から\", \"てる\", \"せる\",\n", " \"が\", \"の\", \"た\", \"は\", \"に\", \"だ\", \"て\", \"と\", \"も\", \"を\", \"お\", \"で\", \"か\",\n", " \"こと\", \"方\", \"的\", \n", " \"な\", \"ば\", \"ね\", \"や\", \"ず\", \"つ\", \"ぬ\",\n", " \"よう\", \"ござる\",\n", " \".\", \"・\",\n", "}" ] }, { "cell_type": "code", "execution_count": 54, "id": "c9294a1a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('ない', 107),\n", " ('残念', 91),\n", " ('部屋', 76),\n", " ('風呂', 53),\n", " ('ただ', 40),\n", " ('思う', 39),\n", " ('少し', 38),\n", " ('狭い', 33),\n", " ('朝食', 30),\n", " ('時', 25),\n", " ('悪い', 25),\n", " ('ちょっと', 24),\n", " ('気', 24),\n", " ('フロント', 18),\n", " ('人', 17),\n", " ('良い', 17),\n", " ('掃除', 17),\n", " ('入る', 17),\n", " ('しまう', 16),\n", " ('時間', 15),\n", " ('もう', 15),\n", " ('だけ', 15),\n", " ('とても', 15),\n", " ('駐車', 14),\n", " ('事', 14),\n", " ('露天', 14),\n", " ('トイレ', 13),\n", " ('髪の毛', 13),\n", " ('場', 13),\n", " ('音', 13),\n", " ('私', 13),\n", " ('チェック', 13),\n", " ('イン', 13),\n", " ('高い', 12),\n", " ('シャワー', 12),\n", " ('少ない', 12),\n", " ('1', 12),\n", " ('ホテル', 12),\n", " ('食事', 12),\n", " ('古い', 12),\n", " ('無い', 12),\n", " ('朝', 12),\n", " ('行く', 12),\n", " ('欲しい', 12),\n", " ('食べる', 12),\n", " ('大', 11),\n", " ('中', 11),\n", " ('洗面', 11),\n", " ('所', 11),\n", " ('夕食', 11)]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_words(\n", " train.query('label_num == 1')[\"text\"],\n", " tokenize= lambda x: tokenize(x, stopwords=stopwords)\n", ").most_common(n=50)" ] }, { "cell_type": "code", "execution_count": 55, "id": "d037a603", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('良い', 417),\n", " ('部屋', 297),\n", " ('利用', 290),\n", " ('とても', 228),\n", " ('美味しい', 202),\n", " ('ホテル', 193),\n", " ('また', 191),\n", " ('満足', 183),\n", " ('思う', 179),\n", " ('風呂', 173),\n", " ('たい', 169),\n", " ('朝食', 167),\n", " ('できる', 126),\n", " ('最高', 123),\n", " ('対応', 108),\n", " ('広い', 108),\n", " ('大', 105),\n", " ('行く', 101),\n", " ('ない', 101),\n", " ('綺麗', 96),\n", " ('よい', 96),\n", " ('いただく', 91),\n", " ('温泉', 88),\n", " ('清潔', 79),\n", " ('接客', 77),\n", " ('気持ち', 75),\n", " ('食事', 70),\n", " ('宿', 69),\n", " ('旅行', 69),\n", " ('フロント', 68),\n", " ('快適', 68),\n", " ('駅', 66),\n", " ('頂く', 65),\n", " ('宿泊', 64),\n", " ('便利', 64),\n", " ('スタッフ', 60),\n", " ('いい', 60),\n", " ('ゆっくり', 58),\n", " ('感', 58),\n", " ('時間', 57),\n", " ('丁寧', 57),\n", " ('夕食', 56),\n", " ('露天', 51),\n", " ('本当', 51),\n", " ('まで', 50),\n", " ('楽しい', 49),\n", " ('近い', 49),\n", " ('入る', 49),\n", " ('出来る', 48),\n", " ('さん', 47)]" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_words(\n", " train.query('label_num == 0')[\"text\"],\n", " tokenize= lambda x: tokenize(x, stopwords=stopwords)\n", ").most_common(n=50)" ] }, { "cell_type": "markdown", "id": "4d189a60", "metadata": {}, "source": [ "```{note}\n", "適切なストップワードの定義が見つかるまで、ストップワードの改善と結果のチェックを繰り返してください。\n", "```\n", "\n", "適切なストップワードが定義できたら、モデルに適用して結果を見てみます。" ] }, { "cell_type": "code", "execution_count": 56, "id": "d219903f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n", "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer= at 0x7f226eab0f70>)),\n", " ('clf', SVC(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n" ] } ], "source": [ "pipe = Pipeline([\n", " (\"vect\", TfidfVectorizer()),\n", " (\"clf\", SVC())\n", "])\n", "\n", "params = [\n", " {\n", " \"vect__tokenizer\": [tokenize, lambda x: tokenize(x, stopwords=stopwords)],\n", " \"clf\": [\n", " SVC(random_state=0),\n", " ],\n", " },\n", "]\n", "\n", "result = run_cv(pipe=pipe, params=params, cv=cv, X=train[\"text\"], y=train[\"label_num\"], stratify=train[\"label\"])" ] }, { "cell_type": "code", "execution_count": 57, "id": "26f4b4d4", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from sklearn.metrics import PrecisionRecallDisplay\n", "\n", "def show_pr(result, y):\n", " \"\"\"run_cvの結果からPRカーブを描画する関数\"\"\"\n", " _, ax = plt.subplots(figsize=(10, 5))\n", " for model_id, (param, pred) in enumerate(result):\n", " print(model_id, param)\n", " PrecisionRecallDisplay.from_predictions(ax=ax, y_true=y, y_pred=pred, name=f\"Model-{model_id}\")" ] }, { "cell_type": "code", "execution_count": 58, "id": "b7ab70db", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 {'clf': SVC(random_state=0), 'vect__tokenizer': }\n", "1 {'clf': SVC(random_state=0), 'vect__tokenizer': at 0x7f226eab0f70>}\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "show_pr(result=result, y=train[\"label_num\"])" ] }, { "cell_type": "markdown", "id": "4b74e436", "metadata": {}, "source": [ "結果を見ると、ストップワードは精度の向上につながっていないようですので、今回は利用しないことにします。" ] }, { "cell_type": "markdown", "id": "63118c1e", "metadata": {}, "source": [ "### ハイパーパラメータを調整\n", "\n", "今回のデータは正例がすくないインバランスなデータセットです。\n", "SVCでは `class_weight=balanced` パラメータを指定することで不均衡データの問題を緩和できる可能性があるので、\n", "このパラメータが効くかをチェックしてみましょう。" ] }, { "cell_type": "code", "execution_count": 60, "id": "d35bbb7a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n", "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(class_weight='balanced', random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n" ] } ], "source": [ "pipe = Pipeline([\n", " (\"vect\", TfidfVectorizer(tokenizer=tokenize)),\n", " (\"clf\", SVC(random_state=0))\n", "])\n", "\n", "params = [\n", " {\n", " \"clf__class_weight\": [None, \"balanced\"],\n", " },\n", "]\n", "\n", "result = run_cv(pipe=pipe, params=params, cv=cv, X=train[\"text\"], y=train[\"label_num\"], stratify=train[\"label\"])" ] }, { "cell_type": "code", "execution_count": 61, "id": "32dfa53b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 {'clf__class_weight': None}\n", "1 {'clf__class_weight': 'balanced'}\n" ] }, { "data": { "image/png": "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553079+/yvFRo0ZVNCdOmzaN9PR0WrRowTHHHFPRP+ujjz6qGC14wgkn8Prrr7N582bA61O2evXqKve8/vrrKzqpd+zYkdNPP51///vfOOeYPXs2aWlp1fqDtWrVCr/fX5GITZ48mYkTJ5KdnU12djbr169n/fr11Z61N3t2lq/82jMBAy9Jff755wF4/vnnOeOMM6qV6dq1K9OnT8fn81FeXs706dOrNEfu6m+3p2XLlnH44YeHFLeIiEikhTMJ+wboZWbdzCwOOB94t3IBMxsM/AMvAdscxlgaTOfOnbnxxhurHZ84cSJz585lwIABTJgwoSIRufPOO5kxYwb9+vXjzTffrKjp69u3L/fccw9jx45lwIABjBkzhg0bNtT67PHjx9O9e3d69uzJ1VdfzeOPP15jubFjx/L5558DXrPemWeeWeX8mWeeycsvv7zPnz0UEyZM4JNPPqFXr158+umnTJjgDZqdM2cOV111FQDnnHMOPXr0oH///gwcOJCBAwdy2mmnVdzj1VdfrTEJmzVrVkWNnoiIyJ4CzvHe9+upNAYuosyFMRIzGw88AkQDzzjn/mRmdwNznHPvmtmnQH9gV3axxjl3em33zMrKcnPmzKlybPHixdU6bsveffvttzz88MPV+lQdzL777jseeuihvX4m/RkREZHrXpjLRws3siLxMmKOugFOnBj2Z5rZXOdcVk3nwtonzDn3IfDhHsfuqLR9YjifLzUbMmQIxx9/PH6/v9YpLw4mW7du5Y9//GOkwxARkUbsiYuHknXPJxD5eVqBRtIxXxrelVdeGekQ6pWaIUVEJBS+gMMfcBSX+EiNcCxatkhERESajZ5tvZH3P2yo34nd94eSMBEREWk2Xv2/kYDXST/SlISJiIhIsxEVZVSfJjwylISJiIiIRICSsHpiZlx88cUV+z6fj7Zt23Lqqafu030yMzPZunXrfpVZsmQJI0eOJD4+ngceeGCv1zvnGD16NPn5u9vD3377bcysyrI/2dnZJCYmMmjQIPr27cu1115LIBDYp8+zp9LSUs477zx69uzJiBEjyM7OrrHcww8/TL9+/Tj88MO54IILKiaXdc5x22230bt3b/r06cOkSZMAeP/997njjjtqvJeIiEhjpCSsniQnJ7Nw4UKKi4sB+OSTT6otGRRurVu3ZtKkSdxyyy21lvvwww8ZOHAgLVq0qDg2efJkjj76aCZPnlylbI8ePZg3bx7z58/nhx9+4O233z6gGP/1r3/RqlUrVqxYwa9+9St+97vfVSuzbt06Jk2axJw5c1i4cCF+v79i8tjnnnuOtWvXsmTJEhYvXsz5558PeOtuvvfeexQVFVW7n4iISGXR+Eny5UFZZP/NaHpTVHw0ATYuqN97dugP4+6ts9j48eP54IMPOOeccyqW1pk5cybgLTt05ZVXsmrVKpKSknjqqacYMGAAubm5XHDBBaxbt46RI0dSefLcF154gUmTJlFWVsaIESN4/PHHa53Xq127drRr144PPvig1jhffPFFrrnmmor9wsJCPv/8c6ZOncppp53GXXfdVe2amJgYjjzySFasWFHnz6E277zzDhMnTgS8mfFvuOEGnHPVFvL2+XwUFxcTGxtLUVERHTt2BOCJJ57gpZdeIirK+//DrrUnzYzjjjuO999/n5/+9KcHFKOIiDRt5cQwcPM78PUQOPqXEYtDNWH16Pzzz+fll1+mpKSE+fPnM2LEiIpzd955J4MHD2b+/Pn8+c9/5tJLLwXgrrvu4uijj2bRokWceeaZrFmzBvBmeH/llVeYNWsW8+bNIzo6umLtyQM1a9asKotfv/POO5x88sn07t2bNm3aMHfu3GrXFBUVMWXKlGprYoK3LuagQYOqvT799NNqZdetW0eXLt6SojExMaSlpVVb6LxTp07ccsstdO3alYyMDNLS0hg7diwAK1eu5JVXXiErK4tx48axfPnyiuuysrIqkl4REZG9udb/Gz7JvAW6HxfROJpeTVgINVbhMmDAALKzs5k8eTLjx4+vcu7zzz/njTfeAGD06NHk5uaSn5/PjBkzePPNNwGvSa1Vq1YATJkyhblz5zJs2DAAiouLK2p9DtS2bdtITd09Rd3kyZO56aabAC+RnDx5ckWStnLlSgYNGoSZccYZZzBu3Lhq96vvxGf79u288847/Pjjj7Rs2ZJzzz2XF154gYsvvpjS0lISEhKYM2cOb775JldeeWXF89u1a8f69evrNRYREWl6pvkOZ8n6BLpG9eDQCMbR9JKwCDv99NO55ZZbmDZtWrUann3hnOOyyy7jL3/5y17LPPbYYzz99NOA189rV5NdXWJiYggEAkRFRbFt2zY+++wzFixYgJnh9/sxM+6//35gd5+w2owaNYqCgoJqxx944AFOPLHqylSdOnVi7dq1dO7cGZ/PR15eHm3atKlS5tNPP6Vbt260bdsWgLPOOosvvviCiy++mM6dO3PWWWcB3kLjV1xxRcV1JSUlJCYmhvQzEBGR5isjLYENeSVMXbqZQztEbt58NUfWsyuvvJI777yzWrPdqFGjKpoTp02bRnp6Oi1atOCYY47hpZdeAuCjjz5i+/btAJxwwgm8/vrrbN68GfBqr1avXl3lntdffz3z5s1j3rx5ISdgAIceeiirVq0C4PXXX+eSSy5h9erVZGdns3btWrp167ZPtVszZ86siKPya88EDLwk9fnnn6949ujRo6v1B+vatSuzZ8+mqKgI5xxTpkypWHz7Jz/5CVOnTgVg+vTp9O7du+K6ZcuWcfjhh4cct4iINE+f3HwsM397PBcM7xrROJSE1bPOnTtz4403Vjs+ceJE5s6dy4ABA5gwYUJFInLnnXcyY8YM+vXrx5tvvknXrt4fiL59+3LPPfcwduxYBgwYwJgxY9iwYUOtz964cSOdO3fmoYce4p577qFz585VpqHY5ZRTTmHatGmA1xR55plnVjl/9tlnVxslWV9+9rOfkZubS8+ePXnooYe4916v+Xj9+vUVTbgjRozgnHPOYciQIfTv359AIFAxkGDChAm88cYb9O/fn1tvvZV//vOfFfeeOnUqp5xySljiFhGRpiMlPoYurZNIS4yNaBzmGsG0/fsiKyvLzZkzp8qxxYsXV9SUSN02bNjApZdeyieffBLpUOrNpk2buPDCC5kyZUqN5/VnREREIsHM5jrnsmo6p5qwZigjI4Orr766xlqyg9WaNWt48MEHIx2GiIhIyNQxv5lqanNp7RpFKiIicrBoMjVhB1uzqjQc/dkQEZHGqEkkYQkJCeTm5uofW6nGOUdubi4JCQmRDkVERKSKJtEc2blzZ3JyctiyZUukQ5FGKCEhgc6dO0c6DBERkSqaRBIWGxtLt27dIh2GiIiISMiaRHOkiIiIyMFGSZiIiIhIBCgJExEREYmAg27GfDPbAqyus+CBSQe2hvkZsu/0vTQ++k4aJ30vjY++k8apIb6XQ5xzbWs6cdAlYQ3BzObsbYkBiRx9L42PvpPGSd9L46PvpHGK9Pei5kgRERGRCFASJiIiIhIBSsJq9lSkA5Aa6XtpfPSdNE76XhoffSeNU0S/F/UJExEREYkA1YSJiIiIRECzTsLM7GQzW2pmK8xsQg3n483sleD5r8wsMwJhNjshfC83m9kPZjbfzKaY2SGRiLM5qes7qVTubDNzZqZRYGEWyndiZj8N/l1ZZGYvNXSMzVEIv7+6mtlUM/su+DtsfCTibE7M7Bkz22xmC/dy3sxsUvA7m29mQxoqtmabhJlZNPAYMA7oC1xgZn33KPYzYLtzrifwMPDXho2y+Qnxe/kOyHLODQBeB+5r2CiblxC/E8wsFbgJ+KphI2x+QvlOzKwXcCtwlHOuH/DLho6zuQnx78rtwKvOucHA+cDjDRtls/QccHIt58cBvYKva4AnGiAmoBknYcBwYIVzbpVzrgx4GThjjzJnAM8Ht18HTjAza8AYm6M6vxfn3FTnXFFwdzbQuYFjbG5C+bsC8Ee8/6iUNGRwzVQo38nVwGPOue0AzrnNDRxjcxTK9+KAFsHtNGB9A8bXLDnnZgDbailyBvBv55kNtDSzjIaIrTknYZ2AtZX2c4LHaizjnPMBeUCbBomu+Qrle6nsZ8BHYY1I6vxOgtX3XZxzHzRkYM1YKH9PegO9zWyWmc02s9pqAqR+hPK9TAQuNrMc4EPgFw0TmtRiX//dqTcxDfEQkXAws4uBLODYSMfSnJlZFPAQcHmEQ5GqYvCaV47Dqy2eYWb9nXM7IhmUcAHwnHPuQTMbCfzHzA53zgUiHZg0vOZcE7YO6FJpv3PwWI1lzCwGr+o4t0Gia75C+V4wsxOB24DTnXOlDRRbc1XXd5IKHA5MM7Ns4AjgXXXOD6tQ/p7kAO8658qdcz8Cy/CSMgmfUL6XnwGvAjjnvgQS8NYvlMgJ6d+dcGjOSdg3QC8z62ZmcXgdJN/do8y7wGXB7XOAz5wmVgu3Or8XMxsM/AMvAVM/l/Cr9TtxzuU559Kdc5nOuUy8fnqnO+fmRCbcZiGU319v49WCYWbpeM2TqxowxuYolO9lDXACgJn1wUvCtjRolLKnd4FLg6MkjwDynHMbGuLBzbY50jnnM7MbgI+BaOAZ59wiM7sbmOOcexf4F15V8Qq8Tn3nRy7i5iHE7+V+IAV4LThOYo1z7vSIBd3EhfidSAMK8Tv5GBhrZj8AfuA3zjnV5IdRiN/Lr4GnzexXeJ30L9d/7sPLzCbj/YckPdgX704gFsA59yRe37zxwAqgCLiiwWLTdy8iIiLS8Jpzc6SIiIhIxCgJExEREYkAJWEiIiIiEaAkTERERCQClISJiIiIRICSMBEREZEIUBImIntlZn4zm2dmC83sPTNrWc/3zw5OJIqZFe6lTKKZTTezaDPLNLPiYEw/mNmTwWWT9uWZWWY2Kbh9nJkdWenctWZ26YF8puB9JprZLXWUec7MztmHe2aa2cIQyv3JzNbu+fM0sxvM7MpQnyci4ackTERqU+ycG+ScOxxvwuLrIxDDlcCbzjl/cH+lc24QMADoC/xkX27mnJvjnLsxuHsccGSlc0865/59oAFH2HvA8BqOP4MWixZpVJSEiUiovgQ6AZhZDzP7r5nNNbOZZnZY8Hh7M3vLzL4Pvo4MHn87WHaRmV2zj8+9CHhnz4POOR/wBdAzWEv0mZnNN7MpZtY1+Nxzg7V435vZjOCx48zsfTPLBK4FfhWsWRu1qwbLzA4zs693PSt4/wXB7aHBmrm5ZvaxmWXUFryZXW1m3wRjeMPMkiqdPtHM5pjZMjM7NVg+2szuD14z38z+b19+WM652TUtueKcKwKyzaymBE1EIkBJmIjUycyi8da727VE0VPAL5xzQ4FbgMeDxycB051zA4EhwKLg8SuDZbOAG82sTYjPjQO6O+eyaziXFIxpAfB34Hnn3ADgxWAcAHcAJwXjqbK0VfCeTwIPB2v7ZlY6twSIM7NuwUPnAa+YWWzwWecEP88zwJ/q+BhvOueGBWNYjLeA8y6ZeLVWpwBPmllC8Hyec24YMAy4ulIcuz57RzP7sI7n1mQOMGo/rhORMGi2a0eKSEgSzWweXg3YYuATM0vBa8LbtXYnQHzwfTRwKUCw+TAvePxGMzszuN0F6AWEso5hOrBjj2M9gjE54B3n3Edm9h/grOD5/wD3BbdnAc+Z2avAmyE8r7JX8ZKve4Pv5wGHAofj/RzAWx+wroV+Dzeze4CWeGueflz5Gc65ALDczFYBhwFjgQGV+oul4f28lu26yDm3Hm+tu321OfgMEWkElISJSG2KnXODgrVOH+P1CXsO2BHsl1UnMzsOOBEY6ZwrMrNpQEKoz6+h7MpQn+2cu9bMRuDVNM01s6EhPhfgFbxE803vVm65mfUHFjnnRu7DfZ4DfuKc+97MLsfrh1YR4p4hA4ZXy1g5WSPYfHqgEvB+piLSCKg5UkTqFOxPdCPwa6AI+NHMzgUwz8Bg0SnAdcHj0WaWhleTsz2YgB0GHLEPz90ORAeb6WrzBXB+cPsiYGYwhh7Oua+cc3cAW/Bq4SorAFL38uyVgB/4A15CBrAUaGtmI4P3jzWzfnXElgpsCDZlXrTHuXPNLMrMegDdg/f/GLguWB4z621myXU8I1S9gTpHWIpIw1ASJiIhcc59B8wHLsBLJn5mZt/j9fs6I1jsJuD4YCf2uXijF/8LxJjZYrymvdn7+Oj/AUfXUeYXwBVmNh+4JBgHwP1mtiA4tcMXwPd7XPcecOaujvk13PcV4GK8pkmcc2XAOcBfg599HpVGV+7FH4Cv8JpGl+xxbg3wNfARcK1zrgT4J/AD8G0w7n+wR6tFbX3CzOw+M8sBkswsx8wmVjp9FPBJHfGKSAMx5/asDRcRaTzMbAjwK+fcJZGO5WBmZoOBm/VzFGk8VBMmIo2ac+5bYGpwhKbsv3S8WjkRaSRUEyYiIiISAaoJExEREYkAJWEiIiIiEaAkTERERCQClISJiIiIRICSMBEREZEI+H8hmSfSkAmpaAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "show_pr(result=result, y=train[\"label_num\"])" ] }, { "cell_type": "markdown", "id": "67935697", "metadata": {}, "source": [ "class_weightを使っても精度の向上は確認できないため、こちらも今回は利用しない方針にします。" ] }, { "cell_type": "markdown", "id": "09677aca", "metadata": {}, "source": [ "## テストセットでの評価\n", "\n", "テストセットを使って、選択したモデルの最終的なオフライン評価の結果を出します。\n", "\n", "クロスバリデーション時は学習データからバリデーション用のデータを切り出していました。\n", "テストセットでの評価時は、クロスバリデーションで決定したパラメータを用いて、\n", "**全ての学習データ** を使ってモデルを学習します。" ] }, { "cell_type": "code", "execution_count": 62, "id": "ab25edef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(random_state=0))])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe = Pipeline([\n", " (\"vect\", TfidfVectorizer(tokenizer=tokenize)),\n", " (\"clf\", SVC(random_state=0)),\n", "])\n", "\n", "pipe.fit(X=train[\"text\"], y=train[\"label_num\"])" ] }, { "cell_type": "code", "execution_count": 63, "id": "8ffba870", "metadata": {}, "outputs": [], "source": [ "test_pred = pipe.decision_function(X=test[\"text\"])" ] }, { "cell_type": "code", "execution_count": 65, "id": "a389d361", "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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sWrVqqLX2JaddtopnnzyyfjHP/4REyZMiBkzZqyxzyWXXBLf/e53IyLinXfeiQ033DA++eSTiIh44IEHoq6uLg488MDVPvPII4/ElClTCp6zK/3dWO36xrQn4hvTnii+YwcB9dHKfbVLPD7amS669wXmv7m8U485YvM+XHjwyHZ/7tRTT+X1119n//3358QTT2TDDTekvr6en//85yxcuJCjjjqKDz74gIkTP+tnd8ghh/DBBx+w4447cv755zNp0qSmbUuWLGG//fZrWh49ejQAkydPZtKkSVx44YUAPPbYY2y55ZZsueWWXHDBBXzzm99k1113bfrc4YcfvkasK1as4LnnnmP77bdvWnfXXXdx8MEHs+mmmzJ9+nS+//3vr/G54cOHs8466/DXv/6VTTbZpN2/o8brWr58eVPJ47jjjuPuu+9m//33X20/SaxYsYKI4IMPPmCjjTZinXWSP+G9996bRx55ZI1jjx8/nuOPP56VK1c27Wtmq3PVUI6mTZvG5ptvzsMPP8w555yz2razzz6b0047jeeff57NNtusaX1dXR29evVizpw5qyUBgNNPP52TTjqJvfbai0suuYQ333wTgFGjRtGtWzfmzp0LwPTp05k8eTIA8+bNY8cddywaa319Pdttt91q62699VYmT57M5MmTufXWWwt+btasWXTr1o3+/fuvtv7hhx9uqh5r/tptt93WOMbixYsZOPCzTuUDBw5k8eI1njTmjDPO4MUXX2TzzTdn1KhRXHXVVXTr1vafcLdu3Rg2bFjT78bM1lR1X5HW5pt7Ofzxj3/kzjvvBODYY4/le9/7XtHPfO1rX+P111/n/vvv57777mOHHXZg3rx59O/fn8mTJzN9+nRGjhzJ3XffzUUXXdSueJYsWbLazfztt9/m1VdfZY899kASPXr0YN68eU3J4sorr+SWW26hd+/e3HbbbWs8hbPXXnsxZ86cdsVQzMyZMxkzZgwPPfQQCxYsYN9992X8+PH06dOnzc9tsskmvPnmm5kSolktcomgjIo9wnjNNdc0fZNu/Pa/0UYbcdRRR3HzzTez00478dhjjwFJo+jtt9/OAw88wOjRo9l0000BGDlyJLNnzy4aS69evVZ7rv72229n6dKlDBkyhMGDB7No0aLVSgXnnHMOc+bM4fHHH2f8+PFrHK89JYIBAwbQ0NDQtNzQ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "PrecisionRecallDisplay.from_predictions(y_true=test[\"label_num\"], y_pred=test_pred, name=f\"Tfidf-SVC\")" ] }, { "cell_type": "markdown", "id": "31fd4fd0", "metadata": {}, "source": [ "結果から読み取れることは、\n", "このモデルを使ってスコア付けして信頼度が大きい順に見ていくと、\n", "ネガティブなレビューデータのうち80%をチェックする(recall=0.8)までには、\n", "おおよそ10回に7回(precision=0.7)は実際にネガティブなレビューである、\n", "と言えます。\n", "\n", "もしもスコア付けしない場合だと、ネガティブなレビューの割合は" ] }, { "cell_type": "code", "execution_count": 68, "id": "8e111d13", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.1438810724714627" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train.query('label_num == 1')) / len(train)" ] }, { "cell_type": "markdown", "id": "1e8b40ba", "metadata": {}, "source": [ "なので、10回に1~2回程度しかネガティブなレビューが見つからない結果になるため、\n", "ネガティブなデータを発見するのに効率的になっていると結論付けられます。\n", "\n", "問題なければ実際の環境にデプロイを行いA/Bテストを実施してオンライン評価を行います。" ] }, { "cell_type": "markdown", "id": "0e7a1f9d", "metadata": {}, "source": [ "## 改善策の検討\n", "\n", "問題なくデプロイができたとしても、次のステップとして精度向上を目指すことになります。\n", "\n", "ここでは、現在のモデルにどのような問題があるのかをチェックしてみましょう。\n", "問題の把握には、実際にモデルの推論結果をチェックすることが重要です。\n", "推論結果からどのようなケースでミスが多いかを知ることができます。\n", "\n", "推論結果をチェックするときに重要なのは、テストセットでの推論結果は**見ない**ことです。\n", "テストセットでの結果を見てしまうと、テストセットに対してチューニングすることになってしまうため、\n", "テストセットでの評価は信頼できないものになってしまいます。\n", "\n", "そこで、CVの結果で誤った推論を行なっている結果を、間違えて信頼スコアを大きく出しているものからチェックしてみましょう。" ] }, { "cell_type": "code", "execution_count": 70, "id": "f53100b1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pipeline(steps=[('vect',\n", " TfidfVectorizer(tokenizer=)),\n", " ('clf', SVC(random_state=0))])\n", "Fold: 0\n", "Fold: 1\n", "Fold: 2\n" ] } ], "source": [ "pipe = Pipeline([\n", " (\"vect\", TfidfVectorizer(tokenizer=tokenize)),\n", " (\"clf\", SVC(random_state=0))\n", "])\n", "\n", "params = dict()\n", "\n", "result = run_cv(pipe=pipe, params=params, cv=cv, X=train[\"text\"], y=train[\"label_num\"], stratify=train[\"label\"])" ] }, { "cell_type": "code", "execution_count": 71, "id": "a38ce75d", "metadata": {}, "outputs": [], "source": [ "train[\"cv_baseline\"] = result[0][1]" ] }, { "cell_type": "markdown", "id": "ecd93bd0", "metadata": {}, "source": [ "信頼度が大きい方から順にソートした上で、ターゲットのラベルが期待していない `0` であるものをチェックします。" ] }, { "cell_type": "code", "execution_count": 73, "id": "e50c901b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
labeltextjudgeslabel_numcv_baseline
1107neutral悪くはありません。{\"0\": 3}00.873437
2811positive臭いもない。{\"1\": 3}00.732087
285neutralがゴロゴロ。{\"0\": 3}00.455168
3579neutralタバコの臭いが気にならない方で熱い風呂が好きなら良いのでは。{\"0\": 3}00.368951
3838positive前日の宿の部屋がちょっと狭かったので、部屋に入るなり広っ!{\"1\": 3}00.242181
3876neutral1階のレストランは夜の営業をやめてしまったようでモーニングのパニーニも以前ほど種類がない(5...{\"0\": 3}00.240477
1669positiveちょっと嬉しかったです。{\"1\": 3}00.218728
3334positiveまたベッドの上に折り鶴が置いてあったのですが、何となくホッコリしました。{\"1\": 3}00.182037
1254neutral部屋は狭いですが寝るだけなら十分です。{\"0\": 3}00.173821
3236neutral温泉がないですが、お風呂があります。{\"0\": 3}00.168143
\n", "
" ], "text/plain": [ " label text judges \\\n", "1107 neutral 悪くはありません。 {\"0\": 3} \n", "2811 positive 臭いもない。 {\"1\": 3} \n", "285 neutral がゴロゴロ。 {\"0\": 3} \n", "3579 neutral タバコの臭いが気にならない方で熱い風呂が好きなら良いのでは。 {\"0\": 3} \n", "3838 positive 前日の宿の部屋がちょっと狭かったので、部屋に入るなり広っ! {\"1\": 3} \n", "3876 neutral 1階のレストランは夜の営業をやめてしまったようでモーニングのパニーニも以前ほど種類がない(5... {\"0\": 3} \n", "1669 positive ちょっと嬉しかったです。 {\"1\": 3} \n", "3334 positive またベッドの上に折り鶴が置いてあったのですが、何となくホッコリしました。 {\"1\": 3} \n", "1254 neutral 部屋は狭いですが寝るだけなら十分です。 {\"0\": 3} \n", "3236 neutral 温泉がないですが、お風呂があります。 {\"0\": 3} \n", "\n", " label_num cv_baseline \n", "1107 0 0.873437 \n", "2811 0 0.732087 \n", "285 0 0.455168 \n", "3579 0 0.368951 \n", "3838 0 0.242181 \n", "3876 0 0.240477 \n", "1669 0 0.218728 \n", "3334 0 0.182037 \n", "1254 0 0.173821 \n", "3236 0 0.168143 " ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.sort_values(\"cv_baseline\", ascending=False).query('label_num == 0').head(n=10)" ] }, { "cell_type": "markdown", "id": "b71ab1ff", "metadata": {}, "source": [ "この結果から、次のようなレビューに対して正しく分類できていないことがわかります。\n", "\n", "* 否定系を含むレビュー(例:悪くはない)\n", "* 問題点はあるが、それは解消できることが後からわかるレビュー(例:温泉はないがお風呂はある)\n", "\n", "これらのケースに共通することは、文脈を捉える必要があるという点です。\n", "ですので、文脈を捉えるモデルであれば精度が改善するという仮説が立てられます。\n", "\n", "では、文脈を捉えるモデルとは何でしょうか。例えば以下の手法を検討することになるでしょう。\n", "\n", "* 特徴量としてN-gramを用いる。ただし、特徴量の次元が大きくなる点には注意が必要。\n", "* 文脈を考慮する文ベクトルを使ったニューラルネットワークを用いた手法。ただし、計算コストやモデルサイズに注意が必要。\n", "\n", "このようにベースラインを基準に、その結果を分析して次の方針を定めてモデルを改善していきます。" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 5 }