数据挖掘之特征工程高级用法

mac2024-10-14  78

处理缺失值重新采样不平衡数据创建新的特征

1处理缺失值

使用数据的已知部分来估算(impute)缺失的值。其中一种方法来自Scikit-Learn中的一个新包叫做Iterative Imputer;它将每个缺失值的特征作为其他特征的函数来建模。它使用该函数的值作为估算。在每个步骤中,选择一个特征作为输出y,其他所有特征作为输入的X。然后在X和y上训练一个回归器,用来预测y的缺失值;可以作为模型保存下来,为后面测试数据做特征拟合,训练集可以有多个特征缺失值,但是类别型缺失值特征和连续性特征缺失值不能放在一个模型中 import numpy as np import pandas as pd train = pd.read_csv("./data/titanic/train.csv",index_col='PassengerId') train['Embarked']=train['Embarked'].map({"S":0,"C":1,"Q":2}) train.info()

Age和Embarked两个特征是具有缺失值,并且一个是连续性特征,另一个是类别型特征。

train[train['Embarked'].isnull()]

# 再从sklearn.impute 导入IterativeImputer from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.ensemble import RandomForestRegressor import pandas as pd # 载入数据 Age特征具有缺失值 Xtrain = train.loc[:, ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare','Embarked']] # 使用随机森林估计器 imp = IterativeImputer(RandomForestRegressor(), max_iter=20, random_state=0) data=imp.fit_transform(Xtrain) data[[61,829],:]

RandomForestRegressor把类别型变量预测为连续性,所以在训练集中;连续型变量要和类别型变量分开做插补。

2重新采样不平衡数据

实际上,我们经常会遇到不平衡的数据。如果目标数据只有轻微的不平衡,这并不一定是一个问题。可以通过对数据使用适当的验证措施来解决这个问题,比如平衡精度(Balanced Accuracy)、精确召回曲线(Precision-Recall Curves)或F1分数(F1-score)。

不幸的是,情况并非总是如此,目标变量可能非常不平衡(例如,10:1)。这种情况下,我们可以对该少数类(即样本数少的类别)进行过采样,以便使用一种称为SMOTE的技术来引入平衡。

SMOTE是合成少数类过采样技术 (Synthetic Minority Oversampling Technique)的缩写,是一种用于增加少数类样本的过采样技术。它通过观察目标的特征空间和检测最近邻来生成新的样本。然后,在相邻样本的特征空间内,简单地选择相似的样本,每次随机地改变一列。要实现SMOTE的模块可以在imbalanced-learn包中找到。导入该包并使用fit_resample方法。

“少数类(minority)”:仅重采样少数类;“非少数类(not minority)”:重新采样除少数类以外的其他类;“非多数类(not majority)”:重新采样除了多数类的其他类;‘所有(all)’:重新采样所有类;“词典(dict)”:键为目标类,值对应于每个目标类所需的样本数量。 from imblearn.over_sampling import SMOTE data =train.loc[:,['Pclass', 'Age', 'SibSp', 'Parch', 'Fare','Embarked','Survived']].dropna() X=data.iloc[:,:-1] y=data['Survived'] pd.value_counts(data['Survived'])

#把类别1的样本重采样到400 X_resampled, y_resampled = SMOTE(ratio={1: 400},random_state=42).fit_resample(X,y) X_resampled.shape

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031215758606.png

X_resampled[:,0]

如果数据集中有分类变量,那么可能会为那些不能发生的变量创建值。例如,如果有一个名为Pclass的变量,它只能是0或1,SMOTE可能会创建2.9595作为值。这种情况下,可以使用SMOTENC,它考虑到了分类变量的性质。这个版本也可以在imbalanced-learn[3]包中找到。

from imblearn.over_sampling import SMOTENC X_resampled_c, y_resampled_c = SMOTENC(sampling_strategy={1: 400},random_state=42,\ categorical_features=[0,2,5]).fit_resample(X,y)
最新回复(0)