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

はじめに

こちらの記事はZennで投稿した「手軽にデータ分析ができる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()
IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfigLandSlopeNeighborhoodCondition1Condition2BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleRoofMatlExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeatingHeatingQCCentralAirElectrical1stFlrSF2ndFlrSFLowQualFinSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaGarageQualGarageCondPavedDriveWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520032003GableCompShgVinylSdVinylSdBrkFace196.0GdTAPConcGdTANoGLQ706Unf0150856GasAExYSBrkr85685401710102131Gd8Typ0NaNAttchd2003.0RFn2548TATAY0610000NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPubFR2GtlVeenkerFeedrNorm1Fam1Story6819761976GableCompShgMetalSdMetalSdNone0.0TATACBlockGdTAGdALQ978Unf02841262GasAExYSBrkr1262001262012031TA6Typ1TAAttchd1976.0RFn2460TATAY29800000NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520012002GableCompShgVinylSdVinylSdBrkFace162.0GdTAPConcGdTAMnGLQ486Unf0434920GasAExYSBrkr92086601786102131Gd6Typ1TAAttchd2001.0RFn2608TATAY0420000NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPubCornerGtlCrawforNormNorm1Fam2Story7519151970GableCompShgWd SdngWd ShngNone0.0TATABrkTilTAGdNoALQ216Unf0540756GasAGdYSBrkr96175601717101031Gd7Typ1GdDetchd1998.0Unf3642TATAY035272000NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPubFR2GtlNoRidgeNormNorm1Fam2Story8520002000GableCompShgVinylSdVinylSdBrkFace350.0GdTAPConcGdTAAvGLQ655Unf04901145GasAExYSBrkr1145105302198102141Gd9Typ1TAAttchd2000.0RFn3836TATAY192840000NaNNaNNaN0122008WDNormal250000

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()
MSSubClassMSZoningLotFrontageLotAreaAlleyLotShapeLandContourLotConfigLandSlopeNeighborhoodCondition1BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeatingQCCentralAirElectrical1stFlrSF2ndFlrSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaPavedDriveWoodDeckSFOpenPorchSFEnclosedPorchScreenPorchPoolQCFenceMiscFeatureMoSoldYrSoldSaleTypeSaleConditionSalePrice
060RL65.08450NaNRegLvlInsideGtlCollgCrNorm1Fam2Story7520032003GableVinylSdVinylSdBrkFace196.0GdTAPConcGdTANoGLQ706Unf0150856ExYSBrkr856854171010213Gd8Typ0NaNAttchd2003.0RFn2548Y06100NaNNaNNaN22008WDNormal208500
120RL80.09600NaNRegLvlFR2GtlVeenkerFeedr1Fam1Story6819761976GableMetalSdMetalSdNone0.0TATACBlockGdTAGdALQ978Unf02841262ExYSBrkr12620126201203TA6Typ1TAAttchd1976.0RFn2460Y298000NaNNaNNaN52007WDNormal181500
260RL68.011250NaNIR1LvlInsideGtlCollgCrNorm1Fam2Story7520012002GableVinylSdVinylSdBrkFace162.0GdTAPConcGdTAMnGLQ486Unf0434920ExYSBrkr920866178610213Gd6Typ1TAAttchd2001.0RFn2608Y04200NaNNaNNaN92008WDNormal223500
370RL60.09550NaNIR1LvlCornerGtlCrawforNorm1Fam2Story7519151970GableWd SdngWd ShngNone0.0TATABrkTilTAGdNoALQ216Unf0540756GdYSBrkr961756171710103Gd7Typ1GdDetchd1998.0Unf3642Y0352720NaNNaNNaN22006WDAbnorml140000
460RL84.014260NaNIR1LvlFR2GtlNoRidgeNorm1Fam2Story8520002000GableVinylSdVinylSdBrkFace350.0GdTAPConcGdTAAvGLQ655Unf04901145ExYSBrkr11451053219810214Gd9Typ1TAAttchd2000.0RFn3836Y1928400NaNNaNNaN122008WDNormal250000

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)
continuousdirty_floatlow_card_intcategoricaldatefree_stringuseless
IdFalseFalseFalseFalseFalseFalseTrue
MSSubClassFalseFalseTrueFalseFalseFalseFalse
MSZoningFalseFalseFalseTrueFalseFalseFalse
LotFrontageTrueFalseFalseFalseFalseFalseFalse
LotAreaTrueFalseFalseFalseFalseFalseFalse
StreetFalseFalseFalseFalseFalseFalseTrue
AlleyFalseFalseFalseTrueFalseFalseFalse
LotShapeFalseFalseFalseTrueFalseFalseFalse
LandContourFalseFalseFalseTrueFalseFalseFalse
UtilitiesFalseFalseFalseFalseFalseFalseTrue

可視化

次に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は教師あり学習の基本的なタスクを簡単にできる
  • 可視化が便利

参考

タイトルとURLをコピーしました