缺失值识别-->缺失值处理-->归一化,标准化-->独热编码-->L1和L2正则化-->基于L1正则化特征选择-->序列特征选择-->RF特征重要性度量

数据预处理与特征工程详解
本文详细介绍了数据预处理的各个环节,包括识别和处理缺失值,如使用均值、中位数或众数填充,以及通过删除或插值方法。探讨了如何编码类别型数据,如有序和无序特征的编码。此外,还讲解了特征缩放的重要性,如归一化和标准化,并对比了MinMaxScaler和StandardScaler。文章提到了特征选择的方法,如L1正则化的逻辑回归进行特征选择,以及使用序列反向选择算法降低特征维度。最后,通过随机森林模型展示了特征重要性的评估。

数据预处理



from IPython.display import Image
%matplotlib inline

处理缺失值

识别表格中的缺失值

import pandas as pd
from io import StringIO
import sys

csv_data = \
'''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
10.0,11.0,12.0,'''


if (sys.version_info < (3, 0)):
    csv_data = unicode(csv_data)

df = pd.read_csv(StringIO(csv_data))
df
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 10.0 11.0 12.0 NaN
# 各行缺失值统计
df.isnull().sum()
A    0
B    0
C    1
D    1
dtype: int64
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
# 通过values属性获取潜在的numpy array
df.values
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan,  8.],
       [10., 11., 12., nan]])


删除具有缺失值的训练样本或特征

# 删除具有缺失值的行

df.dropna(axis=0)
A B C D
0 1.0 2.0 3.0 4.0
# 删除具有缺失值的列

df.dropna(axis=1)
A B
0 1.0 2.0
1 5.0 6.0
2 10.0 11.0
# 删除全部都是nan的行/列,通过指定axis进行控制

df.dropna(how='all')  
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 10.0 11.0 12.0 NaN
# 设定阈值为4,数据中实值个数少于4的行都被删除,这里默认axis=0

df.dropna(thresh=4)
A B C D
0 1.0 2.0 3.0 4.0
# 指定目标列,当该列出现nan,则对应的行被删除

df.dropna(subset=['C'])
A B C D
0 1.0 2.0 3.0 4.0
2 10.0 11.0 12.0 NaN


直接将数据中的缺失值进行删除,方法简便,但可能会造成很多重要信息的丢失

缺失值填充

# 原始数组
df.values
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan,  8.],
       [10., 11., 12., nan]])
# 使用列的均值进行缺失值填充

from sklearn.impute import SimpleImputer
import numpy as np

imr = SimpleImputer(missing_values=np.nan, strategy='mean')
# 可选的填充策略,均值、中位数、众数(这里适用于分类型特征或数值型特征)、某一常数
"""
 - If "mean", then replace missing values using the mean along
      each column. Can only be used with numeric data.
    - If "median", then replace missing values using the median along
      each column. Can only be used with numeric data.
    - If "most_frequent", then replace missing using the most frequent
      value along each column. Can be used with strings or numeric data.
    - If "constant", then replace missing values with fill_value. Can be
      used with strings or numeric data.
"""
imr = imr.fit(df.values)
imputed_data = imr.transform(df.values)
imputed_data
array([[ 1. ,  2. ,  3. ,  4. ],
       [ 5. ,  6. ,  7.5,  8. ],
       [10. , 11. , 12. ,  6. ]])


更加简便的插值方式,使用fillna(),其中将插值策略作为参数传入

df.fillna(df.mean())
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 7.5 8.0
2 10.0 11.0 12.0 6.0

这里的计算方法是:
mean=sum−value−not−nannum−value−not−nan mean = \cfrac{sum-value-not-nan}{num-value-not-nan} mean=numvaluenotnansumvaluenotnan

了解scikit-learn相关API

Image(filename='images/04_01.png', width=400) 

在这里插入图片描述

Image(filename='images/04_02.png', width=300) 

在这里插入图片描述



处理类别型数据

连续型和标称型特征

import pandas as pd

df = pd.DataFrame([['green', 'M', 10.1, 'class2'],
                   ['red', 'L', 13.5, 'class1'],
                   ['blue', 'XL', 15.3, 'class2']])

# 通过df.columns属性指定DataFrame的列名
df.columns = ['color', 'size', 'price', 'classlabel']
df
color size price classlabel
0 green M 10.1 class2
1 red L 13.5 class1
2 blue XL 15.3 class2


连续型特征编码映射

该特征虽然像是类别型特征,但其本质上具有大小关系

size_mapping = {
   
   'XL': 3,
                'L': 2,
                'M': 1}

df['size'] = df['size'].map(size_mapping)
df
color size price classlabel
0 green 1 10.1 class2
1 red 2 13.5 class1
2 blue 3 15.3 class2
inv_size_mapping = {
   
   v: k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)
0     M
1     L
2    XL
Name: size, dtype: object


类别标签编码

这里需要注意,类别标签不存在序号关系,所以将特定字符串编码为哪一个具体整数值并不重要,因此这里可以使用枚举方法

import numpy as np

# 创建一个映射字典
# 实现将类别标签从字符串映射到整数值
class_mapping = {
   
   label: idx for idx, label in enumerate(np.unique(df['classlabel']))}
class_mapping
{'class1': 0, 'class2': 1}
# 编码结果查看
df['classlabel'] = df['classlabel'].map(class_mapping)
df
color size price classlabel
0 green 1 10.1 1
1 red 2 13.5 0
2 blue 3 15.3 1
# 上述操作的逆过程
inv_class_mapping = {
   
   v: k for k, v in class_mapping.items()}
df['classlabel'] = df['classlabel'].map(inv_class_mapping)
df
color size price classlabel
0 green 1 10.1 class2
1 red 2 13.5 class1
2 blue 3 15.3 class2
# 使用sklearn提供的LabelEncoder进行编码,编码结果为0到n-1,其中n为类别的个数
from sklearn.preprocessing import LabelEncoder

class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
y
array([1, 0, 1])
# 删除操作的逆过程
class_le.inverse_transform(y)
array(['class2', 'class1', 'class2'], dtype=object)


对标称型特征进行独热编码

可以直接使用LabelEncoder对类别型的特征进行编码映射,且该方法没有考虑特征值之间大小关系

但是,使用该方法的结果是,数值型的编码结果会依然被算法视为有序的

所以可以采用独热编码,处理无序特征

X = df[['color', 'size', 'price'</
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值