半歩ずつ進める機械学習　~Kaggleに挑戦　HousePrices~

##はじめに
機械学習の勉強の為にscikit-learnのデータセットを使って
カンタンな回帰分析を行い、投稿に纏めてきました

せっかく回帰問題の解法が分かったので、より実践的なスキルにする為に
Kaggleに挑戦してみたいと思います。
自分と同様、ゼロからKaggleを初めて見るという人たちの一助になれば幸いです。

##Kaggleとscikit-learnデータセットの違い
scikit-learnのデータセットには**欠損値**がありませんでした（少なくともBoston住宅価格データセットには）
しかし仮に、人間が手入力したエクセルデータやCSVデータをもとに何らかの分析を行いたい場合
入力ミスなどにより**欠損値**や**異常値**が存在するケースは容易に想像出来ます。

Kaggleのコンペで与えられるデータセットには、欠損値や異常値（らしきもの）も存在するし
文字列のデータがあったり、必要ないようなデータも含まれてたりする事もあります。
また、企業から提供されたデータを用いて、何らかの予測を行うコンペもあったり
データも課題も実践的です。

##挑戦するコンペ
実践的！と言いつつ、まずはKaggleのチュートリアルにあたる[こちらのコンペ][1]に参加します。
物件の広さやプールの有無等から物件の価格を予測するという物です。
内容的にもボストン住宅価格予測とほぼ同じなので、導入にはちょうど良いと考えました。

##勉強の方針
Kaggleではカーネルという実行環境が提供されています。
使い方に慣れる為にも、今回のコンペはカーネルを使って挑戦してみたいと思います。
また、各コンペで沢山のカーネルが公開されています。
公開されているカーネルは自分の環境にコピー可能（Githubのフォークみたいな）で
他人の作ったカーネルを一部改編してモデルを作る事も出来ますが
今回は勉強が第一なので、公開カーネルのカンニングはバリバリしますが、コーディングは自分で行います。

##アカウント作成からカーネル作成まで
アカウント作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/9b3f9e74-5b94-2468-2dfe-0d2d518c861c.png)

如何にもフレッシュな初心者が来たって感じです
joined 2months agoって所が自分の腰の重さを表しています。

アカウントが出来たら、先ほどのコンペのページに移動して
右上の青いボタン**Join Competition**をクリックしてコンペに参加（下の画像は既に参加済みなのでSubmit Predictionに代わってます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/11ac4b43-cd16-71e1-bff6-1aa6c8194a8e.png)

次に**Kernels**タブに移動して**New Kernel**をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/b62bdcf7-f9c2-467f-456c-fd11cc95ee8a.png)

そうしたら、Script形式で各かNotebook形式で書くか選択できるのでお好きな方を
自分は普段JupyterNotebookを使用しているのでNotebookスタイルでやっていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/0b6bfc12-88a5-1321-0825-7bacf1d7eef3.png)

最初はこんな感じになると思います、英語はGoogle翻訳で和訳してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/00e2a1de-e92a-c769-446b-7154eaf7fdf0.png)
右の方にデータセットの置き場所とかの情報があります。

##データインポート
上の画像を参考に、データファイルからデータをインポートしましょう

```python3
#このPython 3環境にはたくさんの役に立つアナリティクスライブラリがインストールされています
#これは、kaggle / python docker image：https://github.com/kaggle/docker-pythonで定義されています。
#例えば、これはロードするのに役立ついくつかのパッケージです。

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

#入力データファイルは "../ input /"ディレクトリにあります。
#例えば、（runをクリックするか、Shift + Enterを押して）これを実行すると、入力ディレクトリ内のファイルが一覧表示されます。

import os
print(os.listdir("../input"))

# 現在のディレクトリに書き込んだ結果はすべて出力として保存されます。

#データをインポート
train = pd.read_csv("../input/train.csv")
sample_sub = pd.read_csv("../input/sample_submission.csv")
test = pd.read_csv("../input/test.csv")
```

とりあえずトレーニングデータでも覗いてみましょう

```python3
print(train.info())
```

```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1460 entries, 0 to 1459
Data columns (total 81 columns):
Id               1460 non-null int64
MSSubClass       1460 non-null int64
MSZoning         1460 non-null object
LotFrontage      1201 non-null float64
LotArea          1460 non-null int64
Street           1460 non-null object
Alley            91 non-null object
LotShape         1460 non-null object
LandContour      1460 non-null object
Utilities        1460 non-null object
LotConfig        1460 non-null object
LandSlope        1460 non-null object
Neighborhood     1460 non-null object
Condition1       1460 non-null object
Condition2       1460 non-null object
BldgType         1460 non-null object
HouseStyle       1460 non-null object
OverallQual      1460 non-null int64
OverallCond      1460 non-null int64
YearBuilt        1460 non-null int64
YearRemodAdd     1460 non-null int64
RoofStyle        1460 non-null object
RoofMatl         1460 non-null object
Exterior1st      1460 non-null object
Exterior2nd      1460 non-null object
MasVnrType       1452 non-null object
MasVnrArea       1452 non-null float64
ExterQual        1460 non-null object
ExterCond        1460 non-null object
Foundation       1460 non-null object
BsmtQual         1423 non-null object
BsmtCond         1423 non-null object
BsmtExposure     1422 non-null object
BsmtFinType1     1423 non-null object
BsmtFinSF1       1460 non-null int64
BsmtFinType2     1422 non-null object
BsmtFinSF2       1460 non-null int64
BsmtUnfSF        1460 non-null int64
TotalBsmtSF      1460 non-null int64
Heating          1460 non-null object
HeatingQC        1460 non-null object
CentralAir       1460 non-null object
Electrical       1459 non-null object
1stFlrSF         1460 non-null int64
2ndFlrSF         1460 non-null int64
LowQualFinSF     1460 non-null int64
GrLivArea        1460 non-null int64
BsmtFullBath     1460 non-null int64
BsmtHalfBath     1460 non-null int64
FullBath         1460 non-null int64
HalfBath         1460 non-null int64
BedroomAbvGr     1460 non-null int64
KitchenAbvGr     1460 non-null int64
KitchenQual      1460 non-null object
TotRmsAbvGrd     1460 non-null int64
Functional       1460 non-null object
Fireplaces       1460 non-null int64
FireplaceQu      770 non-null object
GarageType       1379 non-null object
GarageYrBlt      1379 non-null float64
GarageFinish     1379 non-null object
GarageCars       1460 non-null int64
GarageArea       1460 non-null int64
GarageQual       1379 non-null object
GarageCond       1379 non-null object
PavedDrive       1460 non-null object
WoodDeckSF       1460 non-null int64
OpenPorchSF      1460 non-null int64
EnclosedPorch    1460 non-null int64
3SsnPorch        1460 non-null int64
ScreenPorch      1460 non-null int64
PoolArea         1460 non-null int64
PoolQC           7 non-null object
Fence            281 non-null object
MiscFeature      54 non-null object
MiscVal          1460 non-null int64
MoSold           1460 non-null int64
YrSold           1460 non-null int64
SaleType         1460 non-null object
SaleCondition    1460 non-null object
SalePrice        1460 non-null int64
dtypes: float64(3), int64(35), object(43)
memory usage: 924.0+ KB![Bad Request]()

```
<br>
<br>
<br>
**･･･。。。**

<br>
<br>
<br>
<br>
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/b40a87bc-4427-2993-1996-cfd1d645771c.png)

特徴量が80個ありますね、これくらい当たり前なんでしょうか
少なくともボストン住宅価格のデータセットで15個くらいの特徴量を捏ねてた**(超)初心者**の自分には驚きです！
高い相関を持つ特徴量や、目的変数に対して貢献の低い特徴量を削減したりする必要がありそうです。

**sample_sub.csv**には区画面積とベッドルームの数等から線形回帰で求めたテストセットの予測値が入っているようです
このベンチマーク用の予測値よりも、精度の良い予測をするのが最低限の目標ですね

試しに、このベンチマーク用のデータが、どの程度のスコアを出すのか提出してみて今回は終わりにしようと思います。

##sample_sub.csvのスコア
コンペのページに戻って**Submit Prediction**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/949e5e9a-be33-7063-34ce-b28e67d7ce6c.png)

以下のページになるので、ダウンロードした**sample_sub.csv**をアップロードして
**Make Submission**ボタンを押せばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/64fb79d0-20fd-41bf-b20b-6f9d8e64a8ae.png)


sample_sub.csvをサブミットしてみると以下の順位にランキングされました。
スコアは**0.4089**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/afbe7f18-cee9-157f-f42f-0115d08a29db.png)
~~"このコンペでは予測精度の評価は**RMSE(二乗平均平方誤差)**で行われるみたいです
ただ、このスコアはイコールRMSEの値ではないっぽいです（RMSEにしては低すぎると思うので）"~~
単純なRMSEではなく、予測値と観測値の対数を取って、そのRMSEがスコアになっているようです。
4721人中4414位なんで、さすがにこの記録はなんとしても超えたいですね･･･

##次回へ
次回以降は

+ 特徴量エンジニアリング
+ モデル構築
+ クロスバリデーションで評価
+ モデル改良

といったステップで進めて行くことになると思います。
次回は特徴量の俯瞰で終わりそうな気がします･･･




[1]:https://www.kaggle.com/c/house-prices-advanced-regression-techniques