手軽にデータ分析ができるdablを使ってみた
kaggleでdabl
というライブラリが使われていたので、どんなことができるのか実際に使ってみたいと思います。
dablとは
dablは、教師あり学習における予測モデルを構築するまでの基本的なタスクを自動で行ってくれるライブラリです。dablという名称はData Analysis Baseline Libraryの略称となっています。
できること
主にできることは以下の3つです。
- データのクリーニング
- 可視化
- モデルの学習
特に、可視化は複数のグラフを表示してくれるため、「とりあえず可視化するか」ぐらいの時に有用かと思いました。
インストール
まずはインストールします。
pip install dabl
使ってみる
ここからは、kaggleのデータを使いながらdablを実際に使ってみます。
利用データ
利用するのはHouse Pricesコンペのデータです。
79個の特徴量から住宅の価格を予測する回帰問題になります。
まずはデータを読み込みます。
import pandas as pd
train = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
読み込んだデータは以下のようになります。
train.head()
Id | MSSubClass | MSZoning | LotFrontage | LotArea | Street | Alley | LotShape | LandContour | Utilities | LotConfig | LandSlope | Neighborhood | Condition1 | Condition2 | BldgType | HouseStyle | OverallQual | OverallCond | YearBuilt | YearRemodAdd | RoofStyle | RoofMatl | Exterior1st | Exterior2nd | MasVnrType | MasVnrArea | ExterQual | ExterCond | Foundation | BsmtQual | BsmtCond | BsmtExposure | BsmtFinType1 | BsmtFinSF1 | BsmtFinType2 | BsmtFinSF2 | BsmtUnfSF | TotalBsmtSF | Heating | HeatingQC | CentralAir | Electrical | 1stFlrSF | 2ndFlrSF | LowQualFinSF | GrLivArea | BsmtFullBath | BsmtHalfBath | FullBath | HalfBath | BedroomAbvGr | KitchenAbvGr | KitchenQual | TotRmsAbvGrd | Functional | Fireplaces | FireplaceQu | GarageType | GarageYrBlt | GarageFinish | GarageCars | GarageArea | GarageQual | GarageCond | PavedDrive | WoodDeckSF | OpenPorchSF | EnclosedPorch | 3SsnPorch | ScreenPorch | PoolArea | PoolQC | Fence | MiscFeature | MiscVal | MoSold | YrSold | SaleType | SaleCondition | SalePrice | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 60 | RL | 65.0 | 8450 | Pave | NaN | Reg | Lvl | AllPub | Inside | Gtl | CollgCr | Norm | Norm | 1Fam | 2Story | 7 | 5 | 2003 | 2003 | Gable | CompShg | VinylSd | VinylSd | BrkFace | 196.0 | Gd | TA | PConc | Gd | TA | No | GLQ | 706 | Unf | 0 | 150 | 856 | GasA | Ex | Y | SBrkr | 856 | 854 | 0 | 1710 | 1 | 0 | 2 | 1 | 3 | 1 | Gd | 8 | Typ | 0 | NaN | Attchd | 2003.0 | RFn | 2 | 548 | TA | TA | Y | 0 | 61 | 0 | 0 | 0 | 0 | NaN | NaN | NaN | 0 | 2 | 2008 | WD | Normal | 208500 |
1 | 2 | 20 | RL | 80.0 | 9600 | Pave | NaN | Reg | Lvl | AllPub | FR2 | Gtl | Veenker | Feedr | Norm | 1Fam | 1Story | 6 | 8 | 1976 | 1976 | Gable | CompShg | MetalSd | MetalSd | None | 0.0 | TA | TA | CBlock | Gd | TA | Gd | ALQ | 978 | Unf | 0 | 284 | 1262 | GasA | Ex | Y | SBrkr | 1262 | 0 | 0 | 1262 | 0 | 1 | 2 | 0 | 3 | 1 | TA | 6 | Typ | 1 | TA | Attchd | 1976.0 | RFn | 2 | 460 | TA | TA | Y | 298 | 0 | 0 | 0 | 0 | 0 | NaN | NaN | NaN | 0 | 5 | 2007 | WD | Normal | 181500 |
2 | 3 | 60 | RL | 68.0 | 11250 | Pave | NaN | IR1 | Lvl | AllPub | Inside | Gtl | CollgCr | Norm | Norm | 1Fam | 2Story | 7 | 5 | 2001 | 2002 | Gable | CompShg | VinylSd | VinylSd | BrkFace | 162.0 | Gd | TA | PConc | Gd | TA | Mn | GLQ | 486 | Unf | 0 | 434 | 920 | GasA | Ex | Y | SBrkr | 920 | 866 | 0 | 1786 | 1 | 0 | 2 | 1 | 3 | 1 | Gd | 6 | Typ | 1 | TA | Attchd | 2001.0 | RFn | 2 | 608 | TA | TA | Y | 0 | 42 | 0 | 0 | 0 | 0 | NaN | NaN | NaN | 0 | 9 | 2008 | WD | Normal | 223500 |
3 | 4 | 70 | RL | 60.0 | 9550 | Pave | NaN | IR1 | Lvl | AllPub | Corner | Gtl | Crawfor | Norm | Norm | 1Fam | 2Story | 7 | 5 | 1915 | 1970 | Gable | CompShg | Wd Sdng | Wd Shng | None | 0.0 | TA | TA | BrkTil | TA | Gd | No | ALQ | 216 | Unf | 0 | 540 | 756 | GasA | Gd | Y | SBrkr | 961 | 756 | 0 | 1717 | 1 | 0 | 1 | 0 | 3 | 1 | Gd | 7 | Typ | 1 | Gd | Detchd | 1998.0 | Unf | 3 | 642 | TA | TA | Y | 0 | 35 | 272 | 0 | 0 | 0 | NaN | NaN | NaN | 0 | 2 | 2006 | WD | Abnorml | 140000 |
4 | 5 | 60 | RL | 84.0 | 14260 | Pave | NaN | IR1 | Lvl | AllPub | FR2 | Gtl | NoRidge | Norm | Norm | 1Fam | 2Story | 8 | 5 | 2000 | 2000 | Gable | CompShg | VinylSd | VinylSd | BrkFace | 350.0 | Gd | TA | PConc | Gd | TA | Av | GLQ | 655 | Unf | 0 | 490 | 1145 | GasA | Ex | Y | SBrkr | 1145 | 1053 | 0 | 2198 | 1 | 0 | 2 | 1 | 4 | 1 | Gd | 9 | Typ | 1 | TA | Attchd | 2000.0 | RFn | 3 | 836 | TA | TA | Y | 192 | 84 | 0 | 0 | 0 | 0 | NaN | NaN | NaN | 0 | 12 | 2008 | WD | Normal | 250000 |
Id
列、目的変数となるSalePrice
列、特徴量が79個あり、合計で81列になります。
train.shape
# (1460, 81)
データのクリーニング
まずは、dablを使って、簡単なデータのクリーニングをします。
train_clean = dabl.clean(train, verbose=1)
Detected feature types:
3 float, 35 int, 43 object, 0 date, 0 other
Interpreted as:
continuous 19
dirty_float 0
low_card_int 6
categorical 43
date 0
free_string 0
useless 13
dtype: int64
データの型から適切な変換をしてくれているみたいです。
クリーニングしたデータをみてみます。
train_clean.head()
| | MSSubClass | MSZoning | LotFrontage | LotArea | Alley | LotShape | LandContour | LotConfig | LandSlope | Neighborhood | Condition1 | BldgType | HouseStyle | OverallQual | OverallCond | YearBuilt | YearRemodAdd | RoofStyle | Exterior1st | Exterior2nd | MasVnrType | MasVnrArea | ExterQual | ExterCond | Foundation | BsmtQual | BsmtCond | BsmtExposure | BsmtFinType1 | BsmtFinSF1 | BsmtFinType2 | BsmtFinSF2 | BsmtUnfSF | TotalBsmtSF | HeatingQC | CentralAir | Electrical | 1stFlrSF | 2ndFlrSF | GrLivArea | BsmtFullBath | BsmtHalfBath | FullBath | HalfBath | BedroomAbvGr | KitchenQual | TotRmsAbvGrd | Functional | Fireplaces | FireplaceQu | GarageType | GarageYrBlt | GarageFinish | GarageCars | GarageArea | PavedDrive | WoodDeckSF | OpenPorchSF | EnclosedPorch | ScreenPorch | PoolQC | Fence | MiscFeature | MoSold | YrSold | SaleType | SaleCondition | SalePrice
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
0 | 60 | RL | 65.0 | 8450 | NaN | Reg | Lvl | Inside | Gtl | CollgCr | Norm | 1Fam | 2Story | 7 | 5 | 2003 | 2003 | Gable | VinylSd | VinylSd | BrkFace | 196.0 | Gd | TA | PConc | Gd | TA | No | GLQ | 706 | Unf | 0 | 150 | 856 | Ex | Y | SBrkr | 856 | 854 | 1710 | 1 | 0 | 2 | 1 | 3 | Gd | 8 | Typ | 0 | NaN | Attchd | 2003.0 | RFn | 2 | 548 | Y | 0 | 61 | 0 | 0 | NaN | NaN | NaN | 2 | 2008 | WD | Normal | 208500
1 | 20 | RL | 80.0 | 9600 | NaN | Reg | Lvl | FR2 | Gtl | Veenker | Feedr | 1Fam | 1Story | 6 | 8 | 1976 | 1976 | Gable | MetalSd | MetalSd | None | 0.0 | TA | TA | CBlock | Gd | TA | Gd | ALQ | 978 | Unf | 0 | 284 | 1262 | Ex | Y | SBrkr | 1262 | 0 | 1262 | 0 | 1 | 2 | 0 | 3 | TA | 6 | Typ | 1 | TA | Attchd | 1976.0 | RFn | 2 | 460 | Y | 298 | 0 | 0 | 0 | NaN | NaN | NaN | 5 | 2007 | WD | Normal | 181500
2 | 60 | RL | 68.0 | 11250 | NaN | IR1 | Lvl | Inside | Gtl | CollgCr | Norm | 1Fam | 2Story | 7 | 5 | 2001 | 2002 | Gable | VinylSd | VinylSd | BrkFace | 162.0 | Gd | TA | PConc | Gd | TA | Mn | GLQ | 486 | Unf | 0 | 434 | 920 | Ex | Y | SBrkr | 920 | 866 | 1786 | 1 | 0 | 2 | 1 | 3 | Gd | 6 | Typ | 1 | TA | Attchd | 2001.0 | RFn | 2 | 608 | Y | 0 | 42 | 0 | 0 | NaN | NaN | NaN | 9 | 2008 | WD | Normal | 223500
3 | 70 | RL | 60.0 | 9550 | NaN | IR1 | Lvl | Corner | Gtl | Crawfor | Norm | 1Fam | 2Story | 7 | 5 | 1915 | 1970 | Gable | Wd Sdng | Wd Shng | None | 0.0 | TA | TA | BrkTil | TA | Gd | No | ALQ | 216 | Unf | 0 | 540 | 756 | Gd | Y | SBrkr | 961 | 756 | 1717 | 1 | 0 | 1 | 0 | 3 | Gd | 7 | Typ | 1 | Gd | Detchd | 1998.0 | Unf | 3 | 642 | Y | 0 | 35 | 272 | 0 | NaN | NaN | NaN | 2 | 2006 | WD | Abnorml | 140000
4 | 60 | RL | 84.0 | 14260 | NaN | IR1 | Lvl | FR2 | Gtl | NoRidge | Norm | 1Fam | 2Story | 8 | 5 | 2000 | 2000 | Gable | VinylSd | VinylSd | BrkFace | 350.0 | Gd | TA | PConc | Gd | TA | Av | GLQ | 655 | Unf | 0 | 490 | 1145 | Ex | Y | SBrkr | 1145 | 1053 | 2198 | 1 | 0 | 2 | 1 | 4 | Gd | 9 | Typ | 1 | TA | Attchd | 2000.0 | RFn | 3 | 836 | Y | 192 | 84 | 0 | 0 | NaN | NaN | NaN | 12 | 2008 | WD | Normal | 250000
uselessとなっている13カラムが削除されていました。
train_clean.shape
# (1460, 68)
削除されたカラムを確認してみます。
set(train.columns) - set(train_clean.columns)
# {'3SsnPorch', 'Condition2', 'GarageCond', 'GarageQual', 'Heating', 'Id', 'KitchenAbvGr', 'LowQualFinSF', 'MiscVal', 'PoolArea', 'RoofMatl', 'Street', 'Utilities'}
型の検知
dablは各特徴量の型を検知することもできます。
dabl.detect_types(train)
continuous | dirty_float | low_card_int | categorical | date | free_string | useless | |
---|---|---|---|---|---|---|---|
Id | False | False | False | False | False | False | True |
MSSubClass | False | False | True | False | False | False | False |
MSZoning | False | False | False | True | False | False | False |
LotFrontage | True | False | False | False | False | False | False |
LotArea | True | False | False | False | False | False | False |
Street | False | False | False | False | False | False | True |
Alley | False | False | False | True | False | False | False |
LotShape | False | False | False | True | False | False | False |
LandContour | False | False | False | True | False | False | False |
Utilities | False | False | False | False | False | False | True |
可視化
次にdablで可視化をしていきます。
目的変数となるSalePrice
を対象に可視化してみます。
dabl.plot(train, 'SalePrice')
たった1行で複数のグラフを出力できました。
目的変数の分布だけでなく、数値変数、カテゴリ変数それぞれと目的変数の関係も可視化してくれています。
学習
最後はdablを使ってモデルの学習をしていきます。
model = dabl.SimpleRegressor(random_state=0)
X = train_clean.drop("SalePrice", axis=1)
y = train_clean.SalePrice
model.fit(X, y)
Running DummyRegressor()
r2: -0.013 neg_mean_squared_error: -6332779880.688
=== new best DummyRegressor() (using r2):
r2: -0.013 neg_mean_squared_error: -6332779880.688
Running DecisionTreeRegressor(max_depth=1)
r2: 0.450 neg_mean_squared_error: -3448402932.386
=== new best DecisionTreeRegressor(max_depth=1) (using r2):
r2: 0.450 neg_mean_squared_error: -3448402932.386
Running DecisionTreeRegressor(max_depth=5)
r2: 0.755 neg_mean_squared_error: -1534411175.119
=== new best DecisionTreeRegressor(max_depth=5) (using r2):
r2: 0.755 neg_mean_squared_error: -1534411175.119
Running Ridge(alpha=10)
r2: 0.844 neg_mean_squared_error: -1007546259.414
=== new best Ridge(alpha=10) (using r2):
r2: 0.844 neg_mean_squared_error: -1007546259.414
Running Lasso(alpha=10)
r2: 0.714 neg_mean_squared_error: -1926613454.120
Best model:
Ridge(alpha=10)
Best Scores:
r2: 0.844 neg_mean_squared_error: -1007546259.414
SimpleRegressor(random_state=0)
複数のモデルで学習しスコアを比較して、最もスコアがよかったモデルを返してくれます。
まとめ
- dablは教師あり学習の基本的なタスクを簡単にできる
- 可視化が便利
Discussion