##はじめに
前回の投稿は、実践的なデータ分析を学ぶ為に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を押します。
そうすると以下のような画面になるので、OpenVersionをクリック
以下の画面に遷移するので、左のOutputを押してから右のSubmit to Competitionを押します。
サブミット出来ました、順位は以下のようになりました
4700人中4000位くらいです。
前回が4400位くらいだったんで、300位くらい上がりました
##次回へ
今回はobject型のデータを数値化する処理を行いませんでした。
多量の非数値型データを、効率的に数値型データに変換するノウハウがないので
次回は公開カーネルの中から参考になる物を探して、データの前処理をもう少しやってみようと思います。