💨

手軽にデータ分析ができるdablを使ってみた

2021/02/17に公開

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