这样将属性统一处理是否可行?
来源:5-13 HR表的特征预处理-1
杰哒哒
2018-11-10
老师,看过一个同学提到将属性统一进行预处理的问题。
我想问,在实际工作中,通常是不是都会将属性作统一的处理呢?例如所有的连续变量都用归一化或标准化,所有的离散变量都用标签化或独热编码。会不会出现说在一堆连续属性中会有一两个属性要用其他方法进行单独处理的情况呢?
我尝试修改了你写的代码,将属性统一处理了一下,你看看这是否可行?谢谢!
'''
当MinMax_or_Standard为False时,就进行MinMaxScaler,否则就进行StandardScaler
当LabelEncoder_or_OneHot为False时,就进行LabelEncoder,否则就进行get_dummies(独热编码)处理
当lower_d为True时,就进行降维
ld_n为降维数量
'''
'''创建特征预处理函数'''
def hr_preprocessing(MinMax_or_Standard, LabelEncoder_or_OneHot, lower_d, ld_n):
df = pd.read_csv('HR.csv')
# 1.数据清洗
df = df.dropna(subset=['satisfaction_level', 'last_evaluation']) # subset指定查看哪几列
df = df[df['satisfaction_level']<=1][df['salary']!='nme']
# 2.获取标注
label = df['left']
df = df.drop('left', axis=1) # axix=1代表以列进行删除
# 3.特征选择
# 4.特征预处理
# 4.1 归一化和标准化,用于连续变量
column_list = ['satisfaction_level', 'last_evaluation', 'number_project',
'average_monthly_hours', 'time_spend_company', 'Work_accident',
'promotion_last_5years']
# 如果MinMax_or_Standard为False,就进行归一化
if not MinMax_or_Standard:
for col in column_list:
df[col] = MinMaxScaler().fit_transform(df[col].values.reshape(-1, 1)).reshape(1, -1)[0]
# 否则,就进行标准化
else:
for col in column_list:
df[col] = StandardScaler().fit_transform(df[col].values.reshape(-1, 1)).reshape(1, -1)[0]
# 4.2 标签化编码和独热编码,用于离散变量
column_list = ['department', 'salary']
# 如果LabelEncoder_or_OneHot为False,就进行标签化
if not LabelEncoder_or_OneHot:
for col in column_list:
if col == 'salary':
df[col] = [map_salary(s) for s in df['salary'].values] # 使用映射函数进行转换
else:
df[col] = LabelEncoder().fit_transform(df[col])
df[col] = MinMaxScaler().fit_transform(df[col].values.reshape(-1, 1)).reshape(1, -1)[0]
# 标签化编码后需再进行一次MinMaxScaler变换
# 否则,就进行独热编码
else:
for col in column_list:
df = pd.get_dummies(df, columns=[col]) # get_dummies可以将dataframe进行独热编码
# 4.3 降维
if lower_d:
return PCA(n_components=ld_n).fit_transform(df.values), label
return df, label
写回答
1回答
-
途索
2018-11-11
同学你好,将所有属性都用一种预处理处理方式的使用场景是存在的,而且也是几乎必须要尝试的手段。但需要注意两点:一是在统一进行最小最大化或者标准化之前,一般会进行其他必要的预处理过程,比如去除异常值或者onehot编码;二是有些模型有时不需要最小最大化等操作,比如gbdt,贝叶斯网络等,或者需要额外关注下抽样分布与总体分布的差异等其他细节微调。不过在我个人接触过的大多使用场景中,都用一种处理方式,问题不大。最后,你的代码改的没有问题。
00
相似问题