文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

终于把机器学习中的特征工程搞懂了!!

2024-11-28 16:56

关注

特征工程直接影响机器学习模型的表现,因为模型的效果很大程度上取决于输入数据的质量和特征的选择。

下面,我们来分享10个常用的特征工程技术。

1.插补

插补是处理数据集中的缺失值的一种常用方法。

大多数机器学习算法无法直接处理缺失值,因此在特征工程中必须解决这个问题。

插补方法根据已有的数据推测或生成合理的替代值,以填补缺失的数据。

常见插补方法:

优缺点

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import gensim.downloader as api 
from gensim.models import Word2Vec 
from sklearn.pipeline import Pipeline 
from sklearn.decomposition import PCA 
from sklearn.datasets import load_iris 
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.preprocessing import MinMaxScaler, StandardScaler 


data = pd.DataFrame({
    'doors': [2, np.nan, 2, np.nan, 4],
    'topspeed': [100, np.nan, 150, 200, np.nan],
    'model': ['Daihatsu', 'Toyota', 'Suzuki', 'BYD','Wuling']
})

doors_imputer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value=0))
])

topspeed_imputer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median'))
])

pipeline = ColumnTransformer(
    transformers=[
        ('doors_imputer', doors_imputer, ['doors']),
        ('topspeed_imputer', topspeed_imputer, ['topspeed'])
    ],
    remainder='passthrough'
)

transformed = pipeline.fit_transform(data)

transformed_df = pd.DataFrame(transformed, columns=['doors', 'topspeed', 'model'])

图片

2.分箱

分箱是将连续型数值特征离散化的过程,通过将数值范围划分为多个区间或“箱”,将原始数值转换为离散的类别。

常见的分箱方法

应用场景

np.random.seed(42)
data = pd.DataFrame({'age' : np.random.randint(0, 100, 100)})
data['category'] = pd.cut(data['age'], [0, 2, 11, 18, 65, 101], labels = ['infants', 'children', 'teenagers', 'adults', 'elders'])
print(data)
print(data['category'].value_counts())
data['category'].value_counts().plot(kind='bar')

3.对数变换

对数变换是一种数值转换方法,用于处理数据中呈现偏态分布的特征,将其转换为更接近正态分布的数据形式。

对数变换可以减小大值的影响,压缩特征的数值范围。

应用场景

rskew_data = np.random.exponential(scale=2, size=100)

log_data = np.log(rskew_data)

plt.title('Right Skewed Data')
plt.hist(rskew_data, bins=10)
plt.show()
plt.title('Log Transformed Data')
plt.hist(log_data, bins=20)
plt.show()

4.缩放

缩放是将特征的数值范围转换到某一固定区间内的过程。

常见的缩放方法

其中,μ是均值,σ是标准差。

应用场景

data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)

scaler = MinMaxScaler()
minmax = scaler.fit_transform(data)

scaler = StandardScaler()
standard = scaler.fit_transform(data)

df = pd.DataFrame({'original':data.flatten(),'Min-Max Scaling':minmax.flatten(),'Standard Scaling':standard.flatten()})
df

5.独热编码

独热编码是一种将类别型变量转换为二进制特征的编码方式。

每个类别值被转换为一个独立的二进制特征,这些特征值为0或1,表示该样本是否属于对应的类别。

举例

对于类别型特征 “颜色” = {红,蓝,绿},独热编码会将其转换为三个新特征

应用场景

优缺点

data = pd.DataFrame({'models':['toyota','ferrari','byd','lamborghini','honda','tesla'],
                    'speed':['slow','fast','medium','fast','slow','medium']})
data = pd.concat([data, pd.get_dummies(data['speed'], prefix='speed')],axis=1)
data

6.目标编码

目标编码是一种处理类别型变量的编码方式,通过用该类别与目标变量的统计信息(如均值、概率)来替代类别值。

通常用于高基数的类别变量,避免独热编码导致维度过高的问题。

举例

假设目标是二分类问题,对于类别型特征“城市”,可以用每个城市对应的目标变量均值来替换原始的类别值。

例如,城市A的目标变量均值为0.7,城市B的均值为0.3,城市C的均值为0.5。

应用场景

注意事项

fruits = ['banana','apple','durian','durian','apple','banana']
price = [120,100,110,150,140,160]
data = pd.DataFrame({
  'fruit': fruits,
  'price': price
})
data['encoded_fruits'] = data.groupby('fruit')['price'].transform('mean')
data

7.主成分分析

PCA 是一种线性降维方法,通过将高维数据投影到一个低维空间,同时尽量保留原始数据的方差信息。

PCA 通过计算数据的协方差矩阵,找到数据的主成分(特征向量),然后选择前几个主成分作为新的特征。

步骤

  1. 标准化数据。
  2. 计算协方差矩阵。
  3. 计算协方差矩阵的特征值和特征向量。
  4. 根据特征值大小选择前K个特征向量作为主成分。
  5. 将原始数据投影到新的主成分上。

应用场景

iris_data = load_iris()
features = iris_data.data
targets = iris_data.target

pca = PCA(n_compnotallow=2)
pca_features = pca.fit_transform(features)

for point in set(targets):
    plt.scatter(pca_features[targets == point, 0], pca_features[targets == point,1], label=iris_data.target_names[point])
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.title('PCA on Iris Dataset')
plt.legend()
plt.show()

8.特征聚合

特征聚合是一种通过聚合现有特征来生成新特征的技术。

聚合可以通过多种方式实现,如计算平均值、总和、最大值、最小值等。

特征聚合特别适合处理时间序列数据或分组数据。

应用场景

quarter = ['Q1','Q2','Q3','Q4']
car_sales = [10000,9850,13000,20000]
motorbike_sales = [14000,18000,9000,11000]
sparepart_sales = [5000, 7000,3000, 10000]

data = pd.DataFrame({'car':car_sales,
    'motorbike':motorbike_sales,
    'sparepart':sparepart_sales}, index=quarter)
    
data['avg_sales'] = data[['car','motorbike','sparepart']].mean(axis=1).astype(int)
data['total_sales'] = data[['car','motorbike','sparepart']].sum(axis=1).astype(int)
data

9.TF-IDF

TF-IDF 是一种衡量文本中词汇重要性的特征工程技术,广泛应用于自然语言处理(NLP)任务。

它通过计算词频(TF)和逆文档频率(IDF)来评估某个词在文本中的重要性:

TF-IDF 公式:

其中 N 是文档总数, 是词 t 出现在多少个文档中的次数。

texts = ["I eat rice with eggs.",
        "I also love to eat fried rice. Rice is the most delicious food in the world"]

vectorizer = TfidfVectorizer()
tfidfmatrix = vectorizer.fit_transform(texts)
features = vectorizer.get_feature_names_out()
data = pd.DataFrame(tfidfmatrix.toarray(), columns=features)

print("TF-IDF matrix")
data

10.文本嵌入

文本嵌入是将文本数据转化为数值向量的技术,目的是将语义信息保留在低维向量空间中,使其能够被机器学习模型处理。

常见的文本嵌入方法有:

文本嵌入可以捕捉文本中的语义信息,使模型能够理解文本间的关系。

corpus = api.load('text8') 
model = Word2Vec(corpus) 
dog = model.wv['dog']
print("Embedding vector for 'dog':\n", dog)

来源:程序员学长内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯