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

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

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)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值