一、数值特征处理
1.方法
常见的数值特征处理方式:标准化,有很多种方法网上很多,可以自己去查,常见的有极差标准化法、Z-score标准化法等
2.目的
经过标准化处理的数值特征,在模型训练时能够更快地收敛最佳值,加快模型的训练速度
二、字符型特征处理(最常见问题)
1.原因
对于字符型的特征,我们并不能将其直接传输网络模型中进行训练,需要对其进行编码成数值
2.方法
常用两种编码方式:
- 分类编码:当分类变量的取值之间有大小意义是,如【小学、初中、大学】,可以使用分类编码,将其编码为【0,1,2】
- 独热编码:当分类变量之间没有大小意义是,如【蓝色、黄色、红色】,则使用独热编码
参考:
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.处理方法
参考:
①统计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)