3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

前処理で精度は上がるか?~特別編~

Last updated at Posted at 2018-03-06

前回、4つの前処理法を
(dataset)cacner_datasets
(メソッド)sklearn.svmのSVC
を使って試してみたところ、4つ全てで精度は向上しました。
今回は再現性を確認したいと思い、違うデータで試しました。

(dataset)boston_datasets
(メソッド)sklearn.linear_modelのLinearRegression
※boston_datasetsとはボストン住宅価格と特徴量のデータセットで超有名なものです。ただ、cacner_datasetsの分類(離散データ)と違い、価格の予測(連続データ)なのでSVCは使えません。
あと、私はboston datasetsをcsvでダウンロードしているのでパスを通してデータの読み込みをやっています。なので、パス部分は省略しています。
話それますが、最初のころは相対パスとか絶対パスとか、何のことやらさっぱりわかりませんでした。今でも苦手です(泣

まずは、rawデータで精度を確認

qiita.rb
# csvファイルはdataframeだと扱いやすいのでpandasを呼ぶ
import pandas as pd
from sklearn.model_selection import train_test_split
from pandas import Series,DataFrame
boston_df = pd.read_csv("boston_rawdata.csv")
boston_df.head()

もうすっかり有名なので、今更だが、データ構造はこんな感じ。
右端の”MEDV(住宅価格)”で目的変数のこと。他は説明変数で計13変数ある。
boston_dataset.png

qiita.rb
# 説明変数。dropメソッドでMEDVを落とす。つまりMEDV以外を選択。
X = boston_df.drop('MEDV',1)
# 目的変数
y = boston_df.MEDV

from sklearn.linear_model import LinearRegression
from sklearn.metrics import accuracy_score
# インスタンスを作る
lr=LinearRegression()
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=42)
#  データ形状を見ておこう
print(X_train.shape,y_train.shape)
(379, 13) (379,)

# 訓練データとテストデータのモデルを作る。
lr_train=LinearRegression().fit(X_train,y_train)
lr_test=LinearRegression().fit(X_test,y_test)

# それぞれの精度を見てみよう
print("Scaled train set accuray:
   {:.2f}".format(lr_train.score(X_train,y_train)))
print("Scaled test set accuray:
   {:.2f}".format(lr_test.score(X_test,y_test)))
Scaled train set accuray:0.75
Scaled test set accuray:0.76

精度は訓練データが0.75でテストデータが0.76。over fittingも起こしてなさそうだし、精度も高そう。いいんじゃない?
ココから本番!前処理をすれば0.76以上になるのか?やってみよう!

前処理 StandardScalerを使ってみた

個人的にこの手法がわかりやすいので今回はコチラで。

qiita.rb
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
scaler.fit(X_train)
# こんなアウトプットが出ます。
StandardScaler(copy=True, with_mean=True, with_std=True)

# では転換(fitとtransformはセットで覚える!)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
lr=LinearRegression().fit(X_train_scaled,y_train)

さあ、これで準備が整いました。

qiita.rb
print("Scaled test set accuray:
    {:.2f}".format(lr.score(X_test_scaled,y_test)))
Scaled test set accuray:0.68

あれ?精度は0.68です。rawのtestデータの精度0.76と比較すると「89%」と1割以上も低下しています。

結 論(とりあえず・・)

まったく心許ないサンプルで結論を出すのはホント恥ずかしいのだけど、
1.前処理をすれば必ず上がるわけではない?
2.前処理は目的変数は離散データのほうが当てはまりが良い?つまり分類?
3.私がどこかで間違えた?
のいずれかなのかなー、というのがとりあえずの結論です。
スッキリせず、すいません(汗

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?