質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

523閲覧

教師データの前処理について

nobodytolove123

総合スコア61

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/05 05:54

編集2019/08/05 06:19

いつもお世話になっております。

現在、機械学習の基礎を勉強するためにPythonによるAIプログラミング入門という書籍を利用して学習を行っています。
補足すると、機械学習、数学、統計の知識はほぼ0です。

書籍の2.3.2 平均値を引くという項があったのですが、これが良く理解出来ません。
2.3.2ではsklearnを利用してデータセットの前処理を行うといった内容が記載してあります。

書籍には下記の様な、説明とソースコードが記載してあります。

説明

平均値を引くのは、機械学習で一般的に使われる前処理です。特徴ベクトルから平均を引くと、特徴量の中心が原点になります。特徴ベクトルからバイアスを除去するために、平均を引くわけです。

python

1import numpy as np 2from sklearn import preprocessing 3 4input_data = np.array([[5.1, -2.9, 3.3], 5 [-1.2, 7.8, -6.1], 6 [3.9, 0.4, 2.1], 7 [7.3, -9.9, -4.5]]) 8print("BEFORE:") 9print("Mean =", input_data.mean(axis=0)) 10print("Std deviation =", input_data.std(axis=0)) 11 12data_scaled = preprocessing.scale(input_data) 13print("AFTER:") 14print("Mean =", data_scaled.mean(axis=0)) 15print("Std deviation =", data_scaled.std(axis=0))

上記の説明で、なぜ特徴ベクトルから平均を引くことでバイアスが除去できるのかが分かりません。

簡単に言うと、平均を引くことのメリットを教えて頂きたいです。

ご存じの方がいましたら、ご教授のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

書籍の2.3.2 平均値を引くという項があったのですが、これが良く理解出来ません。

具体的には各次元ごとの平均値を引くです。

イメージ説明

scikit-learn - 特徴量のスケーリング

この処理を行ったあとは次元ごとの平均が0になります。

証明は、X を1次元の確率変数としたとき、X の平均を E(X) で表す場合、
E(X - E(X)) = E(X) - E(X) = 0

サンプルコード

Iris データセットで確認した例

python

1import matplotlib.pyplot as plt 2import numpy as np 3from sklearn import datasets 4 5# データを取得 6iris = datasets.load_iris() 7X = iris.data[:, [0, 2]] # 4次元のうち、2次元取り出す。(プロットするため) 8print(X.shape) # (150, 2) 9 10# 平均を引く。 11scaled = X - X.mean(axis=0) 12 13# 各次元の平均が0になっていることを確認 14print(f"X.mean(): {X.mean(axis=0)}") 15# X.mean(): [5.84333333 3.758 ] 16print(f"scaled.mean(): {scaled.mean(axis=0)}") 17# scaled.mean(): [-3.3158661e-16 -6.6317322e-16] 18 19# 描画する。 20fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(10, 5), sharex=True, sharey=True) 21 22# 変換前のデータ 23ax1.set_title("オリジナル") 24ax1.scatter(X[:, 0], X[:, 1], s=5) 25ax1.set_xlim(-10, 10) 26ax1.set_ylim(-10, 10) 27ax1.grid() 28 29# 変換後のデータ 30ax2.set_title("スケール後") 31ax2.scatter(scaled[:, 0], scaled[:, 1], s=5) 32ax2.grid() 33 34plt.show()

イメージ説明

変換後はデータの平均が原点に移動しているのがわかるかと思います。

投稿2019/08/05 06:36

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobodytolove123

2019/08/05 11:04

ご回答ありがとうございます、わざわざ図はまで....ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問