lightgbm处理类别特征

lightGBM的categorical_feature(类别特征)使用

http://www.luyixian.cn/news_show_253681.aspx

lightGBM比XGBoost的1个改进之处在于对类别特征的处理, 不再需要将类别特征转为one-hot形式, 具体可参考这里.

在使用python API时(参考官方文档)
1.可以使用pd.DataFrame存放特征X, 每一列表示1个特征, 将类别特征设置为X[cat_cols].astype('category'). 这样模型在fit时会自动识别类别特征.
2.在模型的fit方法中传入参数categorical_feature, 指明哪些列是类别特征.
3.类别特征的值必须是从0开始的连续整数, 比如0,1,2,..., 不能是负数.

import json
import os
import math
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import safe_config
import numpy as np

df = pd.read_csv('safe-0817-0822.csv')
import safe_config

df[safe_config.TEXT_CATEGORICAL_COLS] = df[safe_config.TEXT_CATEGORICAL_COLS].fillna('unkown')
# 缺失值填充
missing_value_dict = {}
for col in safe_config.NUMERIC_CATEGORICAL_COLS + safe_config.NUMERIC_COLS:
    fill_value = df[col].median()
    df[col] = df[col].fillna(fill_value)
    missing_value_dict[col] = fill_value
# 缺失值填充dict转json
with open("missing_value_fill.json", "w") as f:
    json.dump(missing_value_dict, f)
    print("缺失值填充json完成...")


def encodeColumns(sdf, colnames):
    df = sdf  # .copy()
    labelEncoderDict = {}
    for col in colnames:
        print(col)
        labelEncoderDict[col] = {}
        le = LabelEncoder()
        df[col] = le.fit_transform(df[col].astype(str))
        clas = le.classes_
        for i in range(0, len(clas)):
            labelEncoderDict[col][clas[i]] = i

    return df, labelEncoderDict


## 导出线上文件

def key_to_json(data):
    if data is None or isinstance(data, (bool, int, str, float)):
        return data
    if isinstance(data, (tuple, frozenset)):
        return str(data)
    if isinstance(data, np.integer):
        return int(data)
    if isinstance(data, np.float):
        return int(data)
    raise TypeError


def to_json(data):
    if data is None or isinstance(data, (bool, int, tuple, range, str, list)):
        return data
    if isinstance(data, (set, frozenset)):
        return sorted(data)
    if isinstance(data, np.float):
        return float(data)
    if isinstance(data, dict):
        return {key_to_json(key): to_json(data[key]) for key in data}
    raise TypeError


df, le_dict = encodeColumns(df, safe_config.CATEGORICAL_COLS)

# label encoder dict
with open(f'''./label_encoder_dict.json''', 'w') as fp:
    json.dump(to_json(le_dict), fp)

df.to_csv('final_safe.csv', index=0, header=True)

import time
# X_train, X_test, y_train, y_test = train_test_split(train_X, train_y, test_size=0.3)
lgb_train = lgb.Dataset(data=x_train,
                        label=y_train,
                        categorical_feature=safe_config.CATEGORICAL_COLS,
                        free_raw_data=False)
print('train')
# lgb_eval = lgb.Dataset(data=x_test,
#                        label=y_test,
#                        categorical_feature=config.CATEGORICAL_COLS,
#                        reference=lgb_train,
#                        free_raw_data=False)
params = {
    'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'binary', #binary xentropy regression
    'metric': {'binary_logloss','xentropy','auc'},
    'num_leaves': 200, #<2^depth
    'max_depth':9,
    'learning_rate': 0.06,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.9,
    'colsample_bytree': 0.9,
    'min_data_in_leaf': 300,
    'max_bin': 1000,
#     'lambda':1,
    'lambda_l1': 0.1,             #l1正则
#     'lambda_l2': 0.001,     #l2正则
#     'min_data':100,
    'is_unbalance':True, ###
#     'scale_pos_weight':10,
    'sub_feature':0.6, 
    'bagging_freq': 5, #每 k 次迭代执行bagging
    'verbose': 1,# <0 显示致命的, =0 显示错误 (警告), >0 显示信息
    'num_iterations':1000
    }

gbm = lgb.train(params,
        lgb_train)

gbm.save_model('model.txt')

rst = gbm.predict(x_test)

 

import lightgbm as lgb
import pandas as pd
import numpy as np
NUMERIC_COLS = [
    'start_distance', 'price', 'time_diff','sex']

df_train = df[(df['parsed_log_time'] < yesterday.strftime("%Y-%m-%d %H:%M:%S"))].drop_duplicates()
df_test = df[(df['parsed_log_time'] >= yesterday.strftime("%Y-%m-%d %H:%M:%S"))].drop_duplicates()

y_train = df_train['success']  # training label
y_test = df_test['success']  # testing label
X_train = df_train[NUMERIC_COLS]  # training dataset
X_test = df_test[NUMERIC_COLS]  # testing dataset
def map_value(x):
    if x == -1:
        return 0
    else:
        return x

X_train['sex'] = X_train.agg(lambda x: map_value(x['sex']),axis=1)
X_train['sex'] = X_train['sex'].astype('category')

X_test['sex'] = X_test.agg(lambda x: map_value(x['sex']),axis=1)
X_test['sex'] = X_test['sex'].astype('category')


num_leaf = 128

# 保存GBDT模型pmml
model = lgb.LGBMClassifier(boosting_type='gbdt', num_leaves=num_leaf, reg_alpha=0.0, reg_lambda=1,
                           max_depth=7, n_estimators=100, objective='binary',
                           learning_rate=0.06, random_state=20, n_jobs=4)
model.fit(X_train, y_train,categorical_feature=['sex'])
print(pd.DataFrame({
    'column': NUMERIC_COLS,
    'importance': model.feature_importances_
}).sort_values(by='importance', ascending=False))

A = {}


def unqiue_element(x):
    a = len(np.unique(x))
    A[x.name] = a


# df[NUMERIC_COLS].apply(unqiue_element)
# print(sorted(A.items(), key=lambda x: x[1], reverse=True))

predictions = model.predict(X_test)
from sklearn.metrics import precision_score, recall_score, roc_auc_score

print('正确率:', model.score(X_test, y_test))
print('精确率:', precision_score(y_test, predictions))
print('召回率:', recall_score(y_test, predictions))
print('auc值:', roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]))

df_test['p0'] = model.predict_proba(X_test)[:, 1]
df_test['rk'] = df_test.groupby(['driver_id', 'parsed_log_time'])['p0'].rank(ascending=0, method='average')
df_test['orderNew'] = df_test.groupby(['driver_id', 'parsed_log_time'])['orderNum'].rank(ascending=1, method='average')
print('测试集新排位平均值:', df_test[df_test['success'] == 1]['rk'].mean())
print('测试集老排位平均值:', df_test[df_test['success'] == 1]['orderNew'].mean())

 

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
LightGBM(轻量级梯度提升机)是一个高效的梯度提升决策树算法,特征工程在LightGBM中起到了至关重要的作用。 特征工程是指对原始数据进行处理和转换,以便更好地适应机器学习算法的需求。在LightGBM中,特征工程可以通过以下几个方面来提升模型的性能: 1. 缺失值处理LightGBM对缺失值的处理非常友好,不需要对缺失值进行特殊处理,可以直接将缺失值作为一个独立的特征进行建模。但是我们仍然可以根据具体情况对缺失值进行处理,以提高模型的性能。 2. 类别特征处理LightGBM类别特征处理也非常方便。可以通过将类别特征进行编码转换为数值特征,或者使用独热编码等方法将类别特征转换为二进制特征。 3. 特征选择:可以使用LightGBM内置的特征重要性评估方法,通过训练模型后获取每个特征的重要性得分,再根据得分选择最重要的特征。这样可以去除无关特征和降低模型的复杂度,提高训练和预测的速度。 4. 特征交叉:可以通过将两个或多个特征进行组合,构造出新的交叉特征。这样可以提取出更高阶的特征信息,增强模型的非线性拟合能力。 5. 特征缩放:可以对特征进行缩放,使得各个特征具有相同的尺度。常用的缩放方法包括标准化和归一化,可以提高模型的稳定性和收敛速度。 总之,LightGBM特征工程方面具有很大的灵活性和便捷性,可以根据实际情况进行特征处理、选择和转换,以提高模型的性能和预测效果。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值