第三次打卡 特征工程

特征工程

目标是对于第二步所做的数据分析处理过的数据进行进一步的分析,并进行处理,对数据进行一些图表或者文字总结。
包括数据理解、数据清洗、特征构造,特征选择,类别不平衡。

  • 数据理解
    数据层:
    定性数据:描述性质
    定量数据:描述数量
    描述层: 进行统计性描述
    解读层
    结论层

  • 数据解读
    目的:提高数据质量,降低算法用错误数据建模的风险
    特征变换:定性变量编码、标准化、归一化
    缺失值处理:少量不处理,大量删除,也可以补全(均值,中位数,众数)、高维映射(one-hot)、模型预测、最邻近补全、矩阵补全(R-SVC)
    异常值处理:简单统计观看,正态分布可使用3a法则,利用模型进行离群点检测(聚类、K邻近等)
    其他:删除无效列、更改dtype

  • 特征构造
    目的:增强数据表达、添加先验知识
    统计量特征
    为了方便,可以使用concat函数把测试集和训练集连接一起进行特征构造,可以增加一个字段来判断测试集和训练集。

# 训练集和测试集放在一起,方便构造特征
Train_data['train']=1
Test_data['train']=0
data = pd.concat([Train_data, Test_data], ignore_index=True)

时间特征:节假日等
地理信息:分桶
非线性变换:log、平方、根号
数据分桶:等频等距分桶、best-KS分桶、卡方分桶
特征组合、特种交叉:FM模型

  • 特种选择
    目的:平衡预测能力和计算复杂度;降低噪声
    过滤式(Filter):先过滤再学习,relief、方差选择、相关系数、卡方检验、互信息发
    包裹式: 将最终要使用的学习器性能作为平衡特征子集的评价标准,LVM
    嵌入式:结合过滤式和包裹式,LR+L1、决策树
  • 类别不平衡
    扩充数据集
    尝试使用其他评价指标,AUC等
    调整sita值
    重采样
    合成样本,SMOTE
    选择其他模型,如决策树
    加权少类别的样本错分代价
    其他:把大类分为小类,将小类视为异常点

代码实战

  • 删除异常值:

调用函数使用箱线图删除异常值

  • 特征构造:
    将训练集和测试集放在一起构造特征
    添加使用时间特征,要注意,数据里有时间出错的格式,所以我们需要 errors=‘coerce’
    添加城市信息
    构造统计数据,统计总计,最大值最小值方差等数据
    数据分桶

可以先输出,给树模型学习

再构造一份特征给 LR NN 之类的模型用
观察特征图,进行取log进行归一化(服从长尾分布)
对于各种特征进行处理,尽量往正态分布进行变换

对于类别进行one-hot编码

  • 特征选择

过滤式:
查看特征和价格的相关性,使用spearman模型
包裹式
嵌入型

Q A

对于决策树模型不推荐对离散特征进行One-hot编码,会产生样本切分不平衡的问题,会影响决策树学习。特征预测能力被认为拆分,导致特征的重要性比实际值低。
如果类别太多的haul,使用catboost。one-hot适应类别比较小的。

服从长尾分布可以取log再进行归一化数据,对于LR模型,决策树效果不明显。
在计算能力的情况下,选择相关系数绝对值大的特征。

特征工程与问题紧密相关,对于非匿名数据,可以依据字段类型进行更多原元化处理方法。特征构造也要和模型联系在一起,对于特征的重要性和处理效果往往也需要通过模型来验证。

异常值处理的函数,出处

# 这里我包装了一个异常值处理的代码,可以随便调用。
def outliers_proc(data, col_name, scale=3):
    """
    用于清洗异常值,默认用 box_plot(scale=3)进行清洗
    :param data: 接收 pandas 数据格式
    :param col_name: pandas 列名
    :param scale: 尺度
    :return:
    """

    def box_plot_outliers(data_ser, box_scale):
        """
        利用箱线图去除异常值
        :param data_ser: 接收 pandas.Series 数据格式
        :param box_scale: 箱线图尺度,
        :return:
        """
        iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
        val_low = data_ser.quantile(0.25) - iqr
        val_up = data_ser.quantile(0.75) + iqr
        rule_low = (data_ser < val_low)
        rule_up = (data_ser > val_up)
        return (rule_low, rule_up), (val_low, val_up)

    data_n = data.copy()
    data_series = data_n[col_name]
    rule, value = box_plot_outliers(data_series, box_scale=scale)
    index = np.arange(data_series.shape[0])[rule[0] | rule[1]]
    print("Delete number is: {}".format(len(index)))
    data_n = data_n.drop(index)
    data_n.reset_index(drop=True, inplace=True)
    print("Now column number is: {}".format(data_n.shape[0]))
    index_low = np.arange(data_series.shape[0])[rule[0]]
    outliers = data_series.iloc[index_low]
    print("Description of data less than the lower bound is:")
    print(pd.Series(outliers).describe())
    index_up = np.arange(data_series.shape[0])[rule[1]]
    outliers = data_series.iloc[index_up]
    print("Description of data larger than the upper bound is:")
    print(pd.Series(outliers).describe())
    
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])
    return data_n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值