特征⼯程:特征是⽤于描述数据中的各种属性、变量或维度的信息,它们是模型⽤来做出预测或分类的输⼊。特征⼯程是使⽤专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作⽤的过程。良好的特征⼯程可以显著提⾼模型的性能,⽽糟糕的特征选择或构建可能导致模型性能下降。特征工程会直接影响机器学习的效果

特征⼯程的主要⽬标包括:

  1. 特征选择:选择最相关的特征,以减少维度和噪声,提⾼模型的泛化能⼒。这可以通过统计⽅法、领域知识、特征重要性评估等⽅式来完成。

  2. 特征构建:创建新的特征,以提供更多的信息或改善模型的性能。这可能包括将原始特征组合、进⾏数学变换、提取时间序列特征等操作。

  3. 特征缩放:确保特征具有相似的尺度,以避免某些特征对模型的权重产⽣不适当的影响。常⻅的缩放⽅法包括标准化和归⼀化。

  4. 处理缺失数据:处理缺失值,可以使⽤插补⽅法来填充缺失值,或者考虑是否删除包含缺失值的样本。

  5. 处理分类特征:将分类特征进⾏编码,例如独热编码(One-Hot Encoding)或标签编码(Label Encoding),以使其适⽤于机器学习模型。

  6. 特征交叉:将不同特征之间的关联性考虑在内,通过创建特征交叉来提供更多信息。

  7. 特征选择和降维:使⽤降维技术(如主成分分析PCA)来减少特征的数量,以提⾼模型的效率和可解释性。

基本预处理:

  1. 缺失值处理:

    1. 删除属性或者删除样本:如果⼤部分样本该属性都缺失,这个属性能提供的信息有限,可以选择放弃使⽤该属性

    2. 统计填充:对于缺失值的属性,尤其是数值类型的属性,根据所有样本关于这维属性的统计值对其进⾏填充,如使⽤平均数、中位数、众数、最⼤值、最⼩值等,具体选择哪种统计值需要具体问题具体分析。

    3. 统⼀填充:常⽤的统⼀填充值有:“空”、“0”、“正⽆穷”、“负⽆穷”等。

    4. 预测/模型填充:可以通过预测模型利⽤不存在缺失值的属性来预测缺失值,也就是先⽤预测模型把数据填充后再做进⼀步的⼯作,如统计、学习等。虽然这种⽅法⽐较复杂,但是最后得到的结果⽐较好。

下面我们使用的泰坦尼克号数据,train.csv文件。

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer

# 读取数据
data = pd.read_csv("train.csv")
# print(data.head())
# print(data.shape)

# 查看数据的基本信息
# print(data.info())

# 查看极值情况
# print(data.describe())

# 查看重复数据
# print(data.duplicated().sum())

# 查看缺失值占比和数量
# print(data.isnull().mean())
# print(data.isnull().sum())

# 缺失值处理Age列,使用fillna()平均数填充
data['Age'] = data['Age'].fillna(value=data['Age'].mean())
# print(data.isnull().sum())

# 缺失值处理Cabin列,方法二用scikit SimpleImputer,这个模块是专门处理缺失值数据的类
imp = SimpleImputer(strategy='constant', fill_value=0)
data[['Cabin']] = imp.fit(data[['Cabin']].values)
# print(data.isnull().sum())

# 缺失值处理Embarked列,使用fillna()众数填充
data['Embarked'] = data['Embarked'].fillna(value=data['Embarked'].mode()[0])
# print(data.isnull().sum())

数值型特征:

  1. 数值型的幅度变换:

    1. log变换、多项式变换:大于0的数据

      下面是针对前面使用的泰坦尼克号数据内的Age列进行的log对数变换处理
      # 对数变换
      data['log_age'] = data['Age'].apply(lambda x: np.log(x))
      # print(data.head())
    2. 幅度缩放(数据预处理):MinMaxScaler、StandardScaler

      1. MinMaxScaler:最大最小化处理,容易收到极值的影响

      2. StandardScaler:标准化处理,性能稳定
        # 最大最小化处理
        mm_scaler = MinMaxScaler()
        fare_train = mm_scaler.fit_transform(data[['Fare']])
        # print(fare_train)
        
        # 标准化处理
        std_scaler = StandardScaler()
        std_scaler_train = std_scaler.fit_transform(data[['Fare']])
        # print(std_scaler_train)
    3. 统计数值:Max、Min、 AVG...

    4. 四则运算:+ - * /

  2. ⾼次特征与交叉特征:preprocessing.PolynomialFeatures
    是什么:PolynomialFeatures 变换⽤于在机器学习中创建多项式特征,它的主要⽬的是扩展特征空间,使模型能够更好地拟合⾮线性关系。这种变换通常⽤于线性回归、逻辑回归、⽀持向量机(SVM)等模型,特别是当原始特征与⽬标之间存在复杂的⾮线性关系时,多项式特征变换可以提⾼模型的性能。
    怎么⽤:对于给定的输⼊特征,例如⼀个特征向量 [x1, x2, x3],PolynomialFeatures 将其转换为多项式的形式,包括原始特征的各种幂和交叉项。例如,对于⼆次多项式,它会⽣成 [x1, x2, x3, x1^2, x2^2, x3^2, x1x2, x1x3, x2x3]。
    什么时候⽤:

    1. ⾮线性关系: 当你有理由相信⽬标变量与特征之间存在⾮线性关系时,多项式特征变换可以⽤来更好地捕捉这些⾮线性关系。

    2. 特定特征之间的交互效应: 如果你怀疑某些特征之间的交互效应对⽬标变量有影响,你可以使⽤多项式特征变换来引⼊这些交互项,以改善模型性能。

    3. 特征⼯程: 在⼀些情况下,多项式特征变换是特征⼯程的⼀部分,⽤于改进模型的性能。

    4. ⾼次特征: 如果你认为某些特征具有⾼次项的影响,例如 x^2, x^3, 等等,你可以使⽤多项式特征变换来引⼊这些⾼次项,以更好地描述数据的复杂性。

    5. ⽤于⽀持向量机 (SVM): 在⽀持向量机中,多项式特征变换可以将数据映射到⾼维空间,从⽽使⽀持向量机能够更好地分隔不同类别的数据。

      # 高次特征
      ploy = PolynomialFeatures(degree=2)
      # print(data[['SibSp', 'Parch']].head())
      poly_fea = ploy.fit_transform(data[['SibSp', 'Parch']])
      # print(poly_fea)
      
      # 获取特征
      feature_names = ploy.get_feature_names_out(input_features=['SibSp', 'Parch'])
      # print(feature_names)
  3. 字符型特征:​​​​​​
    类别型

    1. pandas get_dummies/哑变量

    2. OneHotEncoder()/独热向量编码

    3. 标签编码LabelEncoder()

      # pandas get_dummies/哑变量
      # print(pd.get_dummies(data[['Embarked']]))
      
      # OneHotEncoder()/独热向量编码
      X_train = data[['Embarked']]
      # 初始化OneHotEncoder
      ohe = OneHotEncoder(handle_unknown='ignore')
      # 拟合
      ohe.fit(X_train)
      X_train_ohe = ohe.transform(X_train)
      # print(X_train_ohe.toarray())

更多推荐