为什么 lightgbm 的 `categorical_feature` 不起作用?

Bow*_*eng 4 python pandas lightgbm

我想用LightGBM预测tradeMoney的房子,但我得到的麻烦,当我指定categorical_featurelgb.DatasetLightGBM
我得到data.dtypes如下:

type(train)
pandas.core.frame.DataFrame

train.dtypes
area                  float64
rentType               object
houseFloor             object
totalFloor              int64
houseToward            object
houseDecoration        object
region                 object
plate                  object
buildYear               int64
saleSecHouseNum         int64
subwayStationNum        int64
busStationNum           int64
interSchoolNum          int64
schoolNum               int64
privateSchoolNum        int64
hospitalNum             int64
drugStoreNum            int64
Run Code Online (Sandbox Code Playgroud)

LightGBM用来训练它如下:

categorical_feats = ['rentType', 'houseFloor', 'houseToward', 'houseDecoration', 'region', 'plate']
folds = KFold(n_splits=5, shuffle=True, random_state=2333)

oof_lgb = np.zeros(len(train))
predictions_lgb = np.zeros(len(test))
feature_importance_df = pd.DataFrame()

for fold_, (trn_idx, val_idx) in enumerate(folds.split(train.values, target.values)):
    print("fold {}".format(fold_))
    trn_data = lgb.Dataset(train.iloc[trn_idx], label=target.iloc[trn_idx], categorical_feature=categorical_feats)
    val_data = lgb.Dataset(train.iloc[val_idx], label=target.iloc[val_idx], categorical_feature=categorical_feats)

    num_round = 10000
    clf = lgb.train(params, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=500, early_stopping_rounds = 200)

    oof_lgb[val_idx] = clf.predict(train.iloc[val_idx], num_iteration=clf.best_iteration)

    predictions_lgb += clf.predict(test, num_iteration=clf.best_iteration) / folds.n_splits

print("CV Score: {:<8.5f}".format(r2_score(target, oof_lgb)))
Run Code Online (Sandbox Code Playgroud)

但即使我指定了categorical_features.

ValueError:数据的 DataFrame.dtypes 必须是 int、float 或 bool。没想到字段rentType、houseFloor、houseToward、houseDecoration、region、plate中的数据类型

以下是要求:

LightGBM 版本:2.2.3
Pandas 版本:0.24.2
Python 版本:3.6.8
|Anaconda, Inc.| (默认,2019 年 2 月 21 日,18:30:04)[MSC v.1916 64 位 (AMD64)]

请问有人可以帮我吗?

Myk*_*vyi 8

问题是 lightgbm 只能处理category类型的特征,而不是object. 这里提取了所有可能的分类特征的列表。这些特征在代码中被编码为整数。但是当objectslightgbm发现并非所有特征都已转换为数字时,s没有任何反应,因此会抱怨。

所以解决方案是做

for c in categorical_feats:
    train[c] = train[c].astype('category')
Run Code Online (Sandbox Code Playgroud)

在你的简历循环之前

  • 也许你没有使用数据集API,注意:在构建“Dataset”之前,你应该将分类特征转换为int类型。 (2认同)