pandas 线性回归 特征预处理常见问题总结

一、数值特征处理

1.方法

常见的数值特征处理方式:标准化,有很多种方法网上很多,可以自己去查,常见的有极差标准化法、Z-score标准化法

2.目的

经过标准化处理的数值特征,在模型训练时能够更快地收敛最佳值,加快模型的训练速度

二、字符型特征处理(最常见问题)

1.原因

对于字符型的特征,我们并不能将其直接传输网络模型中进行训练,需要对其进行编码成数值

2.方法

常用两种编码方式:

  • 分类编码:当分类变量的取值之间有大小意义是,如【小学、初中、大学】,可以使用分类编码,将其编码为【0,1,2】
  • 独热编码:当分类变量之间没有大小意义是,如【蓝色、黄色、红色】,则使用独热编码
    参考:https://blog.csdn.net/weixin_42189966/article/details/106781753

3.实现

分类编码

1)标签的分类编码

from sklearn.preprocessing import LabelEncoder
#一步到位的写法
data.loc[:,-1] = LabelEncoder().fit_transform(data.loc[:,-1]) 

# 分部写法
y = data.iloc[:,-1]
le = LabelEncoder()
le = le.fit(y)
label = le.transform(y)
#查看标签中共有多少类别
le.classes_ 

2)特征的分类编码

from sklearn.preprocessing import OrdinalEncoder
# 将数据备份一下
data_ = data
#一步到位的写法
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.loc[:,-1,1])
#分部写法
oe = OrdinalEncoder()
oe = oe.fit(data.iloc[:,1:-1])
data_.iloc[:,1,-1] = oe.transform(data.iloc[:,1,-1])
#查看一共分类的种数
oe.categories_
独热编码

特点:

  • 在类别数量比较多时,会导致特征空间变得比较大,可以结合pca进行降维。
  • 树模型不太需要独热编码,因为对于树模型,数值只是类别符号,没有偏序关系。若树模型使用独热编码则一般起到增加树深度的作用。

使用pandas的get_dummies函数也可以进行独热编码,而且默认对所有字符串类型的列进行独热编码。

import pandas as pd
pd.get_dummies(x)

使用sklearn.preprocessing.OneHotEncoder可以对特征进行独热编码。

from sklearn.preprocessing import OneHotEncoder
x = data.iloc[:,1:-1]
#一步到位完成独热编码
OneHotEncoder(categories = 'auto').fit_transform(x).toarray()
#分部进行
enc = OneHotEncoder(categories = 'auto').fit(x)
result = enc.transform(x).toarray()
#编码还原
pd.Dataframe(enc.inverse_transform(result))
#查看哑变量的每列是什么特征的什么取值
enc.get_feature_names()

三、在Pandas处理NaN值

1.原因

  • 任何给定数据集可能会出现各种糟糕的数据,例如离群值或不正确的值,但是我们几乎始终会遇到的糟糕数据类型是缺少值。
  • Pandas 会为缺少的值分配 NaN 值。

2.处理方法

参考:https://blog.csdn.net/Tyro_java/article/details/81396000

①统计NaN的个数
# 计算在store_items中NaN值的个数
x =  store_items.isnull().sum().sum()

# 输出
print('在我们DataFrame中NaN的数量:', x)
  • .isnull() 方法返回一个大小和 store_items 一样的布尔型 DataFrame,并用 True 表示具有 NaN 值的元素,用 False 表示非 NaN 值的元素。
②处理这些NaN值

1)删除所在行或列

  • 如果 axis = 0,.dropna(axis) 方法将删除包含 NaN 值的任何行

  • 如果 axis = 1,.dropna(axis) 方法将删除包含 NaN 值的任何列

    删除包含NaN值得任何行

    store_items.dropna(axis = 0)

  • 原始 DataFrame 不会改变。你始终可以在 dropna() 方法中将关键字 inplace 设为 True,在原地删除目标行或列

2)填充NaN值
我们可以使用**fillna()**方法将NaN值替换为DataFrame中的上个值,称之为前向填充

  • .fillna(method = ‘ffill’, axis) 将通过前向填充方法沿着给定axis使用上个已知值替换NaN值

    store_items.fillna(method = ‘ffill’, axis = 0)

在这里插入图片描述
同理,也可以使用后向填充:

# 向后填充列,即为NaN的列值,用其列中的后一个来填充
store_items.fillna(method = 'backfill', axis = 0)

补充:假如是对于数值特征的NaN处理,常见思路是通过Z-score标准化法处理数值特征,此时其均值即为0,最后通过将NaN值替换为0:

# 将所有缺失的值替换为相应特征的平均值。通过将特征重新缩放到零均值和单位方差来标准化数据

# 若无法获得测试数据,则可根据训练数据计算均值和标准差
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index # 数值特征
all_features[numeric_features] = all_features[numeric_features].apply(
    lambda x: (x - x.mean()) / (x.std())) # 数值标准化
# 在标准化数据之后,所有均值消失,因此我们可以将缺失值设置为0
all_features[numeric_features] = all_features[numeric_features].fillna(0)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值