学習者言語の分析(基礎)1 第6回

  • 6.1 特徴量スケーリング(正規化と標準化)
    • 6.1.2 正規化
    • 6.1.3 標準化

6.1 特徴量スケーリング(正規化と標準化)¶

  • 以下の図Aでは、2つ変数で3つのグループを明確に分類することができそうです。
  • 一方で、図Bでは、□と△のグループを2つの変数で分類することは難しそうです。 img
  • 図Bの変数Yは100から10000までの値をとるが、図Bの変数Xは0から100までの値しかとらないことが原因で分類ができなくなっているかもしれません。
  • 変数の取りうる値の幅によって、ユークリッド距離、コサイン類似度の計算結果が異なる場合があります。
  • 特徴量スケーリングを行うことによって、この問題を解決することが可能な場合があります。

6.1.2 正規化¶

  • 正規化にはさまざまな手法がありますが、ここでは最も簡単なMin-Max Normalization(最少・最大正規化)を取り上げます。
  • Min-Max Normalizationは以下の手順で行われます。
$$ x_{norm} = \frac{x - min(X)}{max(X) - min(X)} $$
  • $ x_{norm}$(正規化された$x$)は、最大値$max(X)$と最小値$min(X)$の幅の中で、最小値からどれぐらい離れているかという割合のような値に変換します。
  • ここで、$x_{norm}$の最小値は0、最大値は1に変換されます。
In [1]:
import numpy as np

# 乱数の生成
X = np.random.randint(1,100,100)
Y = np.random.randint(1,100000,100)
In [2]:
import pandas as pd

# データフレームに保存
data = pd.DataFrame({"X":X,"Y":Y})
data.head()
Out[2]:
X Y
0 89 94082
1 31 52659
2 17 87102
3 93 98900
4 95 9944
In [3]:
import matplotlib.pyplot as plt
%matplotlib inline
In [4]:
# 散布図
data.plot(kind="scatter",x="X",y="Y")
plt.xlim(0,10000)
Out[4]:
(0.0, 10000.0)
In [9]:
data.min()["X"]
Out[9]:
np.int64(3)
In [10]:
# X, Yの最小値、最大値
X_min = data.min()["X"]
X_max = data.max()["X"]
Y_min = data.min()["Y"]
Y_max = data.max()["Y"]
In [11]:
# Xの正規化
data["X_n"] = (data["X"] - X_min) / (X_max - X_min)
# Yの正規化
data["Y_n"] = (data["Y"] - Y_min) / (Y_max - Y_min)
In [12]:
data.head()
Out[12]:
X Y X_n Y_n
0 89 94082 0.895833 0.945976
1 31 52659 0.291667 0.524857
2 17 87102 0.145833 0.875015
3 93 98900 0.937500 0.994958
4 95 9944 0.958333 0.090602
In [13]:
data.describe()
Out[13]:
X Y X_n Y_n
count 100.00000 100.000000 100.000000 100.000000
mean 55.54000 56726.630000 0.547292 0.566209
std 28.62203 28431.365442 0.298146 0.289042
min 3.00000 1032.000000 0.000000 0.000000
25% 31.00000 33732.250000 0.291667 0.332441
50% 59.50000 59819.500000 0.588542 0.597653
75% 83.25000 80473.500000 0.835938 0.807628
max 99.00000 99396.000000 1.000000 1.000000
In [14]:
data.plot(kind="scatter",x="X_n",y="Y_n")
Out[14]:
<Axes: xlabel='X_n', ylabel='Y_n'>

6.1.3 標準化¶

  • 標準化は以下の手順で行われます。
$$ x_{std} = \frac{x - \bar{x}}{\sigma} $$
  • 上の式において、$\bar{x}$は、データの平均値(算術平均)、$\sigma$は標準偏差。
  • (標本)標準偏差は以下で定義される、個々のデータが平均値からどれぐらい離れているかの平均値。
$$ \sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_{i} - \bar{x})} $$
  • 標準化された値は、平均が0、標準偏差が1になる。
In [15]:
# X, Yの平均値
X_mean = data["X"].mean()
X_std = data["X"].std()
Y_mean = data["Y"].mean()
Y_std = data["Y"].std()
In [16]:
# Xの標準化
data["X_s"] = (data["X"] - X_mean) / X_std

# Yの標準化
data["Y_s"] = (data["Y"] - Y_mean) / Y_std
In [17]:
data.head()
Out[17]:
X Y X_n Y_n X_s Y_s
0 89 94082 0.895833 0.945976 1.169030 1.313879
1 31 52659 0.291667 0.524857 -0.857382 -0.143068
2 17 87102 0.145833 0.875015 -1.346515 1.068375
3 93 98900 0.937500 0.994958 1.308782 1.483340
4 95 9944 0.958333 0.090602 1.378658 -1.645458
In [18]:
data.describe()
Out[18]:
X Y X_n Y_n X_s Y_s
count 100.00000 100.000000 100.000000 100.000000 1.000000e+02 1.000000e+02
mean 55.54000 56726.630000 0.547292 0.566209 4.440892e-18 6.161738e-17
std 28.62203 28431.365442 0.298146 0.289042 1.000000e+00 1.000000e+00
min 3.00000 1032.000000 0.000000 0.000000 -1.835649e+00 -1.958915e+00
25% 31.00000 33732.250000 0.291667 0.332441 -8.573815e-01 -8.087681e-01
50% 59.50000 59819.500000 0.588542 0.597653 1.383550e-01 1.087837e-01
75% 83.25000 80473.500000 0.835938 0.807628 9.681354e-01 8.352349e-01
max 99.00000 99396.000000 1.000000 1.000000 1.518411e+00 1.500785e+00
In [19]:
data.plot(kind="scatter",x="X_s",y="Y_s")
Out[19]:
<Axes: xlabel='X_s', ylabel='Y_s'>
  • データによっては、標準化、正規化によって同じような値が得られる時もあるし、そうでない時もある。
  • 正規化、標準化は、常に行えば良いというものではない。
  • 結果によって判断する。

演習問題¶

  • ../DATA01/text_train/には学習者の作文が保存されています。
  • これらの作文に対する評価は../DATA02/eva_train.csvに保存されています。
  • 評価はGood=1、Poor=0のように2値で付与されています。
  • このデータを用いて自動採点システムを構築し、../DATA01/text_test/に保存されている作文を評価します。
  • 評価に関して以下ような予想をし、これを前提に自動採点システムを構築します。
    • 評価が高い作文には複雑な文が含まれている→文の平均語数が多い
    • 評価が高い作文には難しい(頻度が低い)単語が含まれている→単語の平均文字数が多い
    • 評価が高い作文にはさまざまな単語が含まれている→TTRの値が大きい
  • また、特徴量の値が近いと同じ評価を受けると考えます。