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

##はじめに
[前回の投稿][1]は、実践的なデータ分析を学ぶ為にKaggleに挑戦する為
まずは適当なコンペに参加して、参考として与えられている予測値をSubmitする所まで行きました
今回は、自力で作ったモデルの予測値をsubmitする所までやってみたいと思います。
とりあえず自力でモデルを作ってSubmitが目的なので
クロスバリデーションやパラメータ調整など、モデルの精度向上につながるような事はしません。

##カーネル作成
前回はカーネル作成までやりました
カーネルを新たに作ると、デフォルトで以下のコードから始まります。

```python3
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

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

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

import os
print(os.listdir("../input"))
# Any results you write to the current directory are saved as output.

train = pd.read_csv("../input/train.csv")
test = pd.read_csv("../input/test.csv")

```

訓練データと学習データをインポートして、データの内容を確認します。

```python3
train = pd.read_csv("../input/train.csv")
test = pd.read_csv("../input/test.csv")
train_info()
```

<details><summary>データ内容</summary><div>

```
<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
```

</div>

長いんで折りたたんでますが、int型やらfloat型やらobject型やら
色々なデータタイプが混在していますね。

文字列等の特徴を使いたいなら、objectデータはモデルに学習させる為に数値型のデータにしなければいけません。
半分くらいobject型で面倒なので、とりあえず今は既に数値型のデータだけを抜き出してモデルを作りたいと思います。

```python3
#int型とfloat型のデータだけ抜き出す。
num_train = train.select_dtypes(include = ["int","float"])
num_test = test.select_dtypes(include = ["int","float"])
num_train.info()
```

<details><summary>データ内容</summary><div>

```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1460 entries, 0 to 1459
Data columns (total 38 columns):
Id               1460 non-null int64
MSSubClass       1460 non-null int64
LotFrontage      1201 non-null float64
LotArea          1460 non-null int64
OverallQual      1460 non-null int64
OverallCond      1460 non-null int64
YearBuilt        1460 non-null int64
YearRemodAdd     1460 non-null int64
MasVnrArea       1452 non-null float64
BsmtFinSF1       1460 non-null int64
BsmtFinSF2       1460 non-null int64
BsmtUnfSF        1460 non-null int64
TotalBsmtSF      1460 non-null int64
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
TotRmsAbvGrd     1460 non-null int64
Fireplaces       1460 non-null int64
GarageYrBlt      1379 non-null float64
GarageCars       1460 non-null int64
GarageArea       1460 non-null int64
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
MiscVal          1460 non-null int64
MoSold           1460 non-null int64
YrSold           1460 non-null int64
SalePrice        1460 non-null int64
dtypes: float64(3), int64(35)
memory usage: 433.5 KB
```

</div>

とりあえず数値型のデータを抜き出せました
この中で**LotFrontage**の欠損値の多さが目に付きますので、除外します。
また**MSSubClass**は数値型ですが、**名義尺度**で数値の大きさに意味がないので除外します。
※この時**Id**も落としておくべきでしたが、忘れていました･･･
あと、```num_train```の中の**SalePrice**は教師データなので、切り離しておきます。

```python3
train_y = num_train.SalePrice
train_x = num_train.drop(["SalePrice","MSSubClass","LotFrontage"],axis = 1)
num_test = num_test.drop(["MSSubClass","LotFrontage"],axis=1)
```

次に訓練データとテストデータと教師データの標準化を行います。
が、その前に欠損値がある項目があるので、平均値で埋めます。

```python3
#欠損値の平均値埋め
train_x = train_x.fillna(train_x.mean())
num_test = num_test.fillna(num_test.mean())


#訓練データとテストデータを標準化
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
train_z = sc.fit_transform(train_x)
test_z = sc.transform(num_test)

#教師データも標準化
scy = StandardScaler()
train_yz = scy.fit_transform(train_y.values.reshape(-1,1))
```

これでデータの前処理が終わったので、モデル作りを行います。
今回はSVRをつかってみたいと思います。

```python3
from sklearn.svm import SVR
sv = SVR()
sv.fit(train_z,train_yz)
print(sv.predict(test_z))
```

```
[-0.7267543   0.24604811  0.08090726 ...  0.13239271 -0.44124874
  0.38950905]
```

データを標準化しているんで、予想値も標準化された値になっています。
教師データを標準化した時のスケーラーを使って元のスケールに戻します。

```python3
#教師データが全て整数だったので、予測値も丸めておく
pred = np.round(scy.inverse_transform(sv.predict(test_z)))
print(pred)
```

```
[123206. 200461. 187346. ... 191435. 145879. 211854.]
```

それらしい数字が出てきました
後はこのデータをSubmitするだけですので、Submit用のデータを作ります。
このコンペではSubmitデータは**"Id"**と**"SalePrice"**の二列のcsvデータである必要があります。

```python3
#SubmitデータのDataFrameを作る
sub_data = num_test.Id.to_frame(name = "Id")
sub_data["SalePrice"] = pred
sub_data.info()
```

```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1459 entries, 0 to 1458
Data columns (total 2 columns):
Id           1459 non-null int64
SalePrice    1459 non-null float64
dtypes: float64(1), int64(1)
memory usage: 22.9 KB
```

submit用のデータが出来ましたんで、csvファイル化します。

```python3
sub_data.to_csv("submit_svr.csv",index=False)
```

ここまで出来たらカーネルの右上にある**Commit**を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/c6e1a562-f63d-3133-53ba-6562e0615203.png)

そうすると以下のような画面になるので、**OpenVersion**をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/244f54b7-271e-e786-0f4d-732fb01f96c9.png)

以下の画面に遷移するので、左の**Output**を押してから右の**Submit to Competition**を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/e6f285f8-3f44-732a-73cd-b137a31fa813.png)

サブミット出来ました、順位は以下のようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316551/cba8bc72-b62e-cfe2-99cb-05fa6a246547.png)

4700人中4000位くらいです。
前回が4400位くらいだったんで、300位くらい上がりました

##次回へ
今回はobject型のデータを数値化する処理を行いませんでした。
多量の非数値型データを、効率的に数値型データに変換するノウハウがないので
次回は公開カーネルの中から参考になる物を探して、データの前処理をもう少しやってみようと思います。


[1]:https://qiita.com/Mukomiz/items/c12ba16fb1ef37355dc5