やみとものプログラミング日記 やみとものプログラミング日記
TOP 【Kaggleライブラリ】FeatureManagerクラス(House Prices用)
【Kaggleライブラリ】FeatureManagerクラス(House Prices用)

【Kaggleライブラリ】FeatureManagerクラス(House Prices用)

Kaggle
作成日時: 2020年2月4日(火) 21時13分
更新日時: 2020年2月4日(火) 21時20分

特徴量を管理したかったので特徴量管理クラス(FeatureManagerクラス)を自作しました。

何が便利になったのか自分でもよく分かっていません・・・


import pandas as pd
import xgboost as xgb
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
%matplotlib inline
pd.set_option("display.max_columns", 300)
pd.set_option("display.max_rows", 3000)


FeatureManagerクラス

class FeatureManager:
    features = []
    target_name = None
    
    @classmethod
    def init_features(cls, df_train, target_name=None, def_use=False, print_arr=True):
        cls.target_name = target_name
        
        cls.features = []
        for col in df_train.columns:
            cls.features.append({
                "name": col,
                "use":  def_use,
                "type": df_train[col].dtype,
                "memo": "TARGET" if col == target_name else ""
            })
        if print_arr:
            cls.print_feature_array()
    
    @classmethod
    def print_feature_array(cls, feature_arr=None):
        if feature_arr is None:
            feature_arr = cls.features
            
        print("features = [")
        for f in feature_arr:
            col_quote = f"\"{f['name']}\","
            type_quote = f"\"{f['type']}\","
            use_str = str(f["use"])
            print(f"    {{ \"name\": {col_quote: <17} \"use\": {use_str: <6},   \"type\": {type_quote: <11} \"memo\": \"{f['memo']}\" }},")
        print("]")
        
    @classmethod
    def set_use(cls, feature_name, print_arr=False):
        feature_names = []
        if not isinstance(feature_name, list):
            feature_names.append(feature_name)
        else:
            feature_names = feature_name
        for f_name in feature_names:
            for f in cls.features:
                if f["name"] == f_name:
                    f["use"] = True
        if print_arr:
            cls.print_feature_array()
        
    @classmethod
    def set_unuse(cls, feature_name, print_arr=False):
        for f in cls.features:
            if f["name"] == feature_name:
                f["use"] = False
        if print_arr:
            cls.print_feature_array()
            
    @classmethod
    def set_memo(cls):
        # ★実装しろ!!!
        pass
        
    @classmethod
    def get_use_features(cls):
        ret = []
        for f in cls.features:
            if f["use"] and f["name"] not in ["Id", cls.target_name]:
                ret.append(f["name"])
        return ret
    
    @classmethod
    def print_use_features(cls):
        ret = []
        for f in cls.features:
            if f["use"] and f["name"] not in ["Id", cls.target_name]:
                ret.append(f)
        cls.print_feature_array(ret)
    
    @classmethod
    def get_use_cat_features(cls):
        ret = []
        use_features = cls.get_use_features()
        for f in use_features:
            for ff in cls.features:
                if ff["name"] == f and ff["type"] == "object":
                    ret.append(f)
        return ret
        
    @classmethod
    def get_numeric_features(cls):
        ret = []
        for f in cls.features:
            if f["name"] != cls.target_name and f["name"] != "Id" and f["type"] in ["int64", "float64"]:
                ret.append(f["name"])
        return ret


df_train = pd.read_csv("input/train.csv")
df_test = pd.read_csv("input/test.csv")
FeatureManager.init_features(df_train, target_name="SalePrice", def_use=True)


FeatureManager.print_use_features()


def xgb_reg(tr_x, va_x, tr_y, va_y, te_x):
    import xgboost as xgb
    import numpy as np
    from sklearn.metrics import mean_squared_error
    
    dmat_train = xgb.DMatrix(tr_x, label=tr_y)
    dmat_valid = xgb.DMatrix(va_x, label=va_y)
    dmat_test = xgb.DMatrix(te_x)
    
    params = {"objective": "reg:linear"}
    num_round = 50
    
    # 学習を行う
    model = xgb.train(params, dmat_train, num_round)
    
    # 検証データに対して予測値を計算する
    va_pred = model.predict(dmat_valid)
    
    # 検証データの精度を計算する
    rmse = np.sqrt(mean_squared_error(va_y, va_pred))
    rmse_log = np.sqrt(mean_squared_error(np.log(va_y), np.log(va_pred)))
    
    # テストデータに対するこのモデルの予測値を返す
    pred = model.predict(dmat_test)
    
    return {
        "model": model,
        "pred": pred,
        "rmse": rmse,
        "rmse_log": rmse_log
    }


import pandas as pd
import xgboost as xgb
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
%matplotlib inline


from sklearn.preprocessing import LabelEncoder
# 使用する特徴量を分かりやすさのため絞る
# use_features = [
#     "YearBuilt",    # 建設日
#     "MSSubClass",   # 建物の等級
#     "LotArea",      # 敷地面積
#     "YrSold",       # 販売年
#     "MoSold",       # 販売月
# ]
use_features = FeatureManager.get_use_features()
cat_features = FeatureManager.get_use_cat_features()
df_train_test = pd.concat([df_train, df_test])
for c in cat_features:
#     print(f"c = {c}")
#     print(df_train_test[c].value_counts())
    
    # 欠損値を埋める
    df_train_test[c].fillna("NULL", inplace=True)
    
    le = LabelEncoder()
    le.fit(df_train_test[c])
    df_train[c] = le.transform(df_train[c].fillna("NULL"))
    df_test[c] = le.transform(df_test[c].fillna("NULL"))
train_x = df_train.loc[:, use_features]
train_y = df_train["SalePrice"]
test_x = df_test.loc[:, use_features]


import numpy as np
kf = KFold(n_splits=4, shuffle=True, random_state=894)
rmses = []
rmse_logs = []
ans = np.zeros(len(test_x))
for tr_idx, va_idx in kf.split(train_x):
    tr_x, va_x = train_x.iloc[tr_idx], train_x.iloc[va_idx]
    tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]
    
    res = xgb_reg(tr_x, va_x, tr_y, va_y, test_x)
    
    rmses.append(res["rmse"])
    rmse_logs.append(res["rmse_log"])
    
    ans += res["pred"]
ans /= len(rmses)


CV = np.mean(rmse_logs)
print(f"CV = {CV}")

CV = 0.14188780713840835

data = {
    "Id": df_test["Id"],
    "SalePrice": ans
}
df_ans = pd.DataFrame(data)
df_ans.head()
df_ans.to_csv("xgb_cv_0_141.csv", index=False)



コメント(0)

まだコメントがありません。
もしよろしければ下のフォームからコメント下さい。


コメントする

もしよろしければコメント下さい。

ハンドルネーム:

内容:

最新記事


【英語】テスト駆動勉強法
【英語】テスト駆動勉強法
コサイン類似度はベクトルを正規化してから内積を取っている
コサイン類似度はベクトルを正規化してから内積を取っている
【ゼロから作るDeep Learning 2】MatMulノード解説
【ゼロから作るDeep Learning 2】MatMulノード解説
『Kaggle』カテゴリの記事