全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
3354 1
2020-12-22
特征工程入门
机器学习算法将数据集的特征作为输入,确定其中的模式并创建输出。模型的性能取决于我们传递给构建模型的不同类型的输入变量。
功能工程是构建智能系统的重要组成部分。Feature Engineering是一门艺术,也是一门科学,这就是典型的数据科学家花费70%至80%的时间来清理和准备可改善模型质量的数据的原因。
谷歌研究总监彼得·诺维格(Peter Norvig)说:“我们没有比别人更好的算法,我们只有更多的数据。” (来源:《福布斯》)
通过本文,我希望人们能够了解不同类型的要素工程技术,并可以使用这些技术来改善模型性能。
表中的内容
      什么是特征工程?
      装箱
      分割功能
      处理时间序列数据
      通过组合新功能来创建新功能
      进行转换以使数据正常分布
什么是特征工程?
您使用的功能对结果的影响远不止其他。据我所知,没有任何算法可以补充正确的特征工程所提供的信息。
—卢卡·马萨隆(Luca Massaron)
特征工程是使用领域知识通过数据挖掘技术从给定数据集中创建/提取新特征的过程。它有助于机器学习算法理解数据并确定可提高机器学习算法性能的模式。
特征工程
进行特征工程的步骤
      头脑风暴功能。
      创建特征。
      检查功能如何与模型一起使用。
      从头开始,直到功能完美运行
创建新功能非常依赖原始数据中存在的潜在问题和功能。
更好的功能可加快训练速度并提供更准确的预测。例如,采用一种算法来预测时尚商店随时间的销售额。冬季,尤其是圣诞节前后,时装销售达到顶峰。添加一项功能可以告诉我们离圣诞节多少天了,该算法比日期本身更具直觉。
装箱
在处理数字数据时,我们会遇到一些功能,这些功能的变量分布偏斜,这意味着某些值集会大量出现而有些则非常罕见。直接使用此类功能可能会导致问题或给出不正确的结果。
特征工程
装箱是一种方法,可以根据数值连续变量所属的列的值范围对数值连续变量进行分类,从而将其连续转换为离散变量。在这种类型的转换中,我们创建容器。每个仓允许特定范围的连续数值。它可以防止过度拟合并提高模型的鲁棒性。
让我们通过一个例子来理解这一点。我们有10个学生的分数,分别是35、46、89、20、58、99、74、60、18、81。我们的任务是组成3个团队。第一组的学生分数在1-40之间,第二组的学生分数在41-80之间,第三组的学生分数在81-100之间。
特征工程
可以用下面列出的不同方式进行装箱。
      固定–宽度合并
      分位数分档
      本能装箱
1.固定–宽度合并
正如名称所示,在固定宽度合并中,我们为每个容器指定了特定的固定宽度,这些宽度通常由用户分析数据预先定义。每个分类箱都有一个预定范围的值,应根据某些领域知识,规则或约束条件将其分配给该分类箱。
让我们举个例子来更好地理解它,我们可以将一个人的年龄间隔归为10年(十年)。0-9年将在bin-1中,10-19在bin-2中,类似地在20-29在bin-3中
特征工程
这可以通过下面的python代码实现。
将熊猫作为pd导入
#读取文件
df_bin = pd.read_csv('stroke_prediction.csv')
#创建垃圾箱和标签
垃圾箱= [1
标签= ['bin-1','bin-2','bin-3','bin-4']
df_bin ['age_range'] = pd.cut(df_bin ['age'],bins =容器,labels =标签)
2.分位数合并
如果在数字特征固定宽度合并范围内存在大量空白,效果将不那么有效,那么将有许多没有数据的空容器。在这种情况下,分档是根据分位数分布进行的。
分位数将数据分成相等的部分。中位数将数据分为两部分,一半数据小于中位数,一半数据大于中位数。四分位数分为四分之一,十分位数分为十等。
3.本能分类
实际上,这涉及根据您自己对数据的个人见解以及我们希望将数据分类到的设置范围进行手动分类的手动过程。
让我们举个例子来更好地理解它,我们可以将一个人的年龄划分为一个年龄段:未成年人为1-18岁,年轻人为19-29岁,老人为30-49岁,非常大为50-100岁。
这可以通过下面的python代码实现。
将熊猫作为pd导入
#读取文件
df_bin = pd.read_csv('stroke_prediction.csv')
#创建垃圾箱和标签
垃圾箱= [1
标签= ['未成年人','年轻','旧','非常_旧']
df_bin ['age_range'] = pd.cut(df_bin ['age'],bins =容器,labels =标签)
分割功能
大多数时候,数据集包含复杂特征,即两个或多个特征的组合。通过提取和创建更有意义的特征,可以通过发现潜在信息来提高模型性能。
它可以应用于连续特征和分类特征。
例如:假设在住房价格数据集中有一个特征“楼层”,其值以浮动为单位,整数部分代表楼层数,小数部分0.5表示是否有顶层公寓。
将熊猫作为pd导入
#读取文件
df = pd.read_csv('housing_price.csv')
#分离整数部分和小数部分以创建两个新功能
df ['floor_num'] = df ['floors']。apply(lambda x:x // 1)
df ['Is_penrhouse'] = df ['floors']。apply(lambda x:x%1)
处理时间序列数据
日期列提供有关模型目标的有价值的信息,它们被忽略为机器学习算法的输入。
如果您将日期列保留为未操作状态,则对于机器学习算法而言,在值之间建立关系将非常具有挑战性
      我们可以将日期的一部分提取到不同的列中,例如年,月,日,周等。
      我们可以找到两个日期之间的天数。
      我们可以创建新功能,例如一天是周末还是工作日。
      我们可以创建诸如假期与否之类的功能。
这可以通过熊猫函数“ strftime”和“ DatetimeIndex”来实现
以下是我提取一年中月份和星期的示例。同样,我们可以创建更多功能,例如日,年,周末等
将熊猫作为pd导入
#读取文件
df = pd.read_csv('housing_price.csv')
df ['date'] = pd.to_datetime(df ['date'])
df ['month'] = pd.DatetimeIndex(df ['date'])。month
df ['week'] = pd.DatetimeIndex(df ['date'])。week
通过组合多个功能来创建新功能
在这种类型的特征工程技术中,我们通过组合两个或多个特征来创建新特征,这可以为我们提供更多见解。
例如,我们有一个中风预测数据集,我们需要在其中预测一个人是否会中风。
特征工程
在这里,我们可以看到并且也可以通过EDA确认年龄更大的人有中风的机会,同样,BMI较高和avg_gulcose_level的人更容易中风。
我们可以创建新功能,例如,如果人员年龄> 50,而avg_gulcode_level> 180,则填充1
另外,如果一个人患有高血压和心脏病,我们可以创建特征,然后为其创建另一个特征。
将熊猫作为pd导入
#读取文件
df = pd.read_csv('stroke_prediction.csv')
#与患有高血压和心脏病的人一起创建新功能
一个=(df [“高血压”] ==“ 1”)
b =(df [“ heart_disease”] ==“ 1”)
df ['hypertension_heart_patient'] = a&b
df = df.replace(True,1)
df = df.replace(False,0)
进行转换以使数据正常分布
一些机器学习模型(例如线性回归和逻辑回归)都假设变量遵循正态分布。数据集中的变量更可能具有偏斜的分布。为了消除变量的偏度并使之服从正态分布或接近正态分布,我们应用了不同的变换来提高模型的性能。
特征工程-转换
下面列出了最常用的变量转换方法:
      对数变换
      倒数变换
      指数或幂转换
      Box-cox转换
      杨约翰逊变换
1.对数变换
这是所有转换中最流行的转换,也是最简单的转换。”
通常,它在右偏分布上实现,以使其成为正态分布或类似于正态分布。
F(x)= ln(x)
仅当变量中存在所有正值时才能执行此转换。
将熊猫作为pd导入
将numpy导入为np
从sklearn.preprocessing导入FunctionTransformer
#加载数据
df = pd.read_csv('anydata.csv')
#create columns变量保存需要转换的列
列= ['col_1','col_2','col_3']
#使用对数转换创建函数转换器对象
logarithm_transfer = FunctionTransformer(np.log,validate = True)
#应用转换
data_new = logarithm_transfer.transform(data [columns])
2.相互转换:
倒数变换将大值转换为相同符号的小值,并反转相同符号值之间的顺序。
f(x)= 1 / x
这可以通过sklearn FunctionTransformer函数来实现。以下是使用相同功能的代码实现的摘要。
将熊猫作为pd导入
将numpy导入为np
从sklearn.preprocessing导入FunctionTransformer
#加载数据
df = pd.read_csv('anydata.csv')
#create columns变量保存需要转换的列
列= ['col_1','col_2','col_3']
#使用对数转换创建函数转换器对象
reciprocal_transfer = FunctionTransformer(np.reciprocal,validate = True)
#应用转换
data_new = reciprocal_transfer.transform(data [columns])
3.指数变换
通常,它在左偏分布上实现,以使其成为正态分布或类似于正态分布。
我们可以根据变量的分布使用平方,立方,平方根等指数变换。
F(x)= x ^ 2
F(x)= x ^ 3
F(x)= x ^ n
以下是使用相同功能的代码实现的摘要。
将熊猫作为pd导入
将numpy导入为np
从sklearn.preprocessing导入FunctionTransformer
#加载数据
df = pd.read_csv('anydata.csv')
#create columns变量保存需要转换的列
列= ['col_1','col_2','col_3']
#使用指数转换创建函数转换器对象
#在这里使用x ^ 3是任意的,您可以选择任何指数
exponential_transfer = FunctionTransformer(lambda x:x **(3),validate = True)
#应用转换
data_new = exponential_transfer.transform(data [columns])
尾注
在本文中,我们看到了一个简单的代码模式,用于从原始输入数据创建任意数量的“功能”,以及一些有用的转换建议。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2022-4-13 09:18:11
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群