LoginSignup
2
1

More than 5 years have passed since last update.

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

Posted at

はじめに

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

カーネル作成

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

# 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")

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

train = pd.read_csv("../input/train.csv")
test = pd.read_csv("../input/test.csv")
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

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

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

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

データ内容
<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

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

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

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

#欠損値の平均値埋め
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をつかってみたいと思います。

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]

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

#教師データが全て整数だったので、予測値も丸めておく
pred = np.round(scy.inverse_transform(sv.predict(test_z)))
print(pred)
[123206. 200461. 187346. ... 191435. 145879. 211854.]

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

#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ファイル化します。

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

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

image.png

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

image.png

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

image.png

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

image.png

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

次回へ

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

2
1
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
2
1