特征工程对于我们在机器学习的建模当中扮演着至关重要的角色,要是这一环节做得好,模型的准确率以及性能就被大大地被提升,今天小编就通过Python
当中的lambda
函数来对数据集进行一次特征工程的操作,生成一些有用的有价值的特征出来。
导入数据集
那么首先呢,我们先导入数据集,导入Pandas
模块
import pandas as pd
import numpy as np
df=pd.read_csv(‘students_performance.csv’)
df
output
离散化处理
首先我们将写作这一列“writing score”的值做一个离散化处理,基于具体的写作的分数,将其分成是“Outstanding”和“Satisfactory”两种,代码如下
df["WritingCategory"] = df["writing score"].apply(lambda x: "Outstanding" if x >= 90 else "Satisfactory")
df.head()
output
数据聚合
我们还可以计算出总分,也就是把写作的分数、数学的分数以及阅读的分数加起来,求一个总和,代码如下
df1 = df.assign(Total_Score=lambda x: (x['math score'] + x['reading score'] + x['writing score']))
df1.head()
output
数据的过滤
数据的过滤我们也可以用到lambda
函数,过滤出我们想要的数据,代码如下
filtered_greater_than_eighty = df1[df1.apply((lambda x: (x['Total_Score']/300 * 100)>80),axis=1)]
filtered_greater_than_eighty.head()
output
二进制编码处理
而针对“lunch”这一列当中的值,我们来进行二进制处理,通过调用map()
函数以及lambda
函数来完成,代码如下
df['lunch'] = df['lunch'].map(lambda x: '1' if x == 'standard' else '0')
df.head()
output
特征编码
对于“race/ethnicity”这一列,我们将离散型变量转换成连续型的数值,通过调用lambda
函数,代码如下
categorical_encoding = df.assign(encoded_race = lambda x: (pd.factorize(df["race/ethnicity"])[0]))
categorical_encoding.head()
output
标准化处理
数据的标准化(normalization)是将数据按比例缩放,使之落入在一个小的特定区间,其中最典型的就是数据的归一化处理,即将数据统一映射到【0,1】区间上,常见的数据归一化的方法有
z-score 标准化
也叫标准化标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数是:
而调用lambda
函数来进行转换的话,例如我们针对数学的分数“math score”来进行转换,代码如下
df['zscore_mathvalue'] = df.apply((lambda x: round((x['math score']-df['math score'].mean())/
df['math score'].std(), 2)), axis=1)
df.head()
Min-Max标准化
也叫做是离差标准化,是对原始数据的线性变换,使得结果落在【0,1】区间内,转换的函数如下:
其中max
为样本数据的最大值,min
为样本数据的最小值,当然这种方法存在着缺陷就是当有新数据加入时,可能导致max
和min
的变化。我们针对阅读的分数“reading score”来进行标准化处理,代码如下
df['minmax_reading_score'] = df.apply((lambda x: round((x['writing score']-df['writing score'].min())/
(df['writing score'].max() - df['writing score'].min()), 2)), axis=1)
df.head()
output
IQR
通过四分位间距,我们可以找到哪些是极值。这里我们就那“writing score”也就是写作的分数举例子,代码如下
Q1 = df['writing score'].quantile(0.25)
Q3 = df['writing score'].quantile(0.75)
IQR = Q3 - Q1
df['writing score'].apply(lambda x: 'Outliers' if (x > Q3 + 1.5 * IQR) or
(x < Q1 - 1.5 * IQR) else 'Normal')
df.head()
output
NO.1
往期推荐
Historical articles
Python数据清洗 & 预处理入门完整指南
案例实操|手把手教你搭建 RFM 客户价值分析模型
分享5个好用到爆的第三方Python模块
值得收藏的30道Python练手题(附详解)
分享、收藏、点赞、在看安排一下?