- 处理缺失值
- 重新采样不平衡数据
- 创建新的特征
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)