机器学习算法学习之特征工程2

电子说

1.3w人已加入

描述

缩放和归一化

缩放和归一化是特征工程中的重要步骤,以确保特征具有类似的比例和范围。这可以帮助改善一些机器学习算法的性能,并使优化过程更快。以下是用于缩放和归一化的一些常见技术:

1.标准化:标准化将特征缩放,使其具有零均值和单位方差。这通过从每个值中减去均值,然后将其除以标准差来完成。结果值将具有零均值和单位方差。

以下是使用 scikit-learn 的标准化示例:

from sklearn.preprocessing import StandardScaler


# Create a StandardScaler object
scaler = StandardScaler()


# Fit and transform the data
X_scaled = scaler.fit_transform(X)

2.最小-最大缩放:最小-最大缩放将特征缩放到一个固定的范围,通常在0和1之间。这通过从每个值中减去最小值,然后除以范围来完成。

以下是使用 scikit-learn 的最小-最大缩放示例:

from sklearn.preprocessing import MinMaxScaler


# Create a MinMaxScaler object
scaler = MinMaxScaler()


# Fit and transform the data
X_scaled = scaler.fit_transform(X)

预处理

Fig.4 — Standardization and Normalization

3.鲁棒缩放:鲁棒缩放与标准化类似,但它使用中位数和四分位距代替均值和标准差。这使得它对数据中的异常值更加鲁棒。

以下是使用 scikit-learn 的鲁棒缩放示例:

from sklearn.preprocessing import RobustScaler


# Create a RobustScaler object
scaler = RobustScaler()


# Fit and transform the data
X_scaled = scaler.fit_transform(X)

4.归一化:归一化将每个观测值缩放为单位范数,这意味着每个特征值的平方和为1。这对于某些需要所有样本具有类似比例的算法非常有用。

以下是使用 scikit-learn 进行归一化的示例:

from sklearn.preprocessing import Normalizer


# Create a Normalizer object
scaler = Normalizer()


# Fit and transform the data
X_scaled = scaler.fit_transform(X)

创建新特征

创建新特征是特征工程中的一个重要步骤,它涉及从现有数据中创建新的变量或列。这可以帮助捕捉特征之间的复杂关系并提高模型的准确性。

以下是创建新特征的一些技术:

1.交互特征:交互特征是通过将两个或多个现有特征相乘来创建的。这可以帮助捕捉特征的联合效应并揭示数据中的新模式。例如,如果我们有两个特征,“年龄”和“收入”,我们可以通过将这两个特征相乘来创建一个名为“age_income”的新交互特征。

以下是使用 Python 中的 Pandas 创建交互特征的示例:

import pandas as pd


# create a sample data frame
data = pd.DataFrame({'age': [25, 30, 35],
                     'income': [50000, 60000, 70000]})


# create a new interaction feature
data['age_income'] = data['age'] * data['income']


# display the updated data frame
print(data)

2.多项式特征:多项式特征是通过将现有特征提高到更高的幂来创建的。这可以帮助捕捉特征之间的非线性关系并提高模型的准确性。例如,如果我们有一个特征“年龄”,我们可以通过将这个特征平方来创建一个新的多项式特征称为“age_squared”。

以下是使用 Python 中的 Scikit-learn 创建多项式特征的示例:

from sklearn.preprocessing import PolynomialFeatures
import numpy as np


# create a sample data set
X = np.array([[1, 2],
              [3, 4]])


# create polynomial features up to degree 2
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)


# display the updated feature matrix
print(X_poly)

3.分箱:分箱将连续值分组为离散类别。这可以帮助捕捉非线性关系并减少数据中异常值的影响。例如,如果我们有一个特征“年龄”,我们可以通过将年龄分组为不同的类别,例如“0-18”、“18-25”、“25-35”、“35-50”和“50+”,来创建一个名为“age_group”的新分箱特征。

以下是使用 Python 中的 Pandas 创建分箱特征的示例:

import pandas as pd


# create a sample data frame
data = pd.DataFrame({'age': [20, 25, 30, 35, 40, 45, 50, 55]})


# create bins for different age groups
bins = [0, 18, 25, 35, 50, float('inf')]
labels = ['0-18', '18-25', '25-35', '35-50', '50+']
data['age_group'] = pd.cut(data['age'], bins=bins, labels=labels)


# display the updated data frame
print(data)

处理不平衡数据

处理不平衡数据是机器学习中的一个重要方面。不平衡数据是指目标变量的分布不均匀,其中一个类别相对于另一个类别的样本数量较少。这可能会导致模型对多数类别产生偏差,并且模型可能在少数类别上表现不佳。一些处理不平衡数据的技术包括:

1.过采样(Upsampling):过采样通过对现有样本进行替换性重采样来为少数类别创建更多的样本。可以使用 sklearn.utils 模块中的 resample 函数来实现。

from sklearn.utils import resample


# Upsample minority class
X_upsampled, y_upsampled = resample(X_minority, y_minority, replace=True, n_samples=len(X_majority), random_state=42)

2.降采样(Downsampling):降采样通过从多数类别中删除一些样本来平衡分布。可以使用 sklearn.utils 模块中的 resample 函数来实现。

from sklearn.utils import resample


# Downsample majority class
X_downsampled, y_downsampled = resample(X_majority, y_majority, replace=False, n_samples=len(X_minority), random_state=42)

Fig.4 — UnderSampling and OverSampling

3.合成少数类过采样技术(SMOTE):SMOTE 涉及基于现有样本为少数类创建合成样本。这可以使用 imblearn.over_sampling 模块中的 SMOTE 函数来完成。

from imblearn.over_sampling import SMOTE


# Use SMOTE to upsample minority class
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X, y)

4.类别权重(Class Weighting):类别权重将权重分配给模型中的每个类别,以考虑不平衡性。可以使用模型中的 class_weight 参数来实现。

from sklearn.linear_model import LogisticRegression


# Use class weighting to handle imbalance
clf = LogisticRegression(class_weight='balanced', random_state=42)
clf.fit(X_train, y_train)

5.异常检测(Anomaly Detection):异常检测涉及识别数据中的异常值并将其删除。可以使用 sklearn.ensemble 模块中的 IsolationForest 函数来实现。异常检测是在数据集中识别与预期或正常行为显著偏离的罕见事件或观测值。在不平衡数据的情况下,其中一个类别的观测值数量远低于另一个类别,可以使用异常检测来识别和标记少数类别中的罕见观测值为异常值。这可以帮助平衡数据集并提高机器学习模型的性能。

在不平衡数据中进行异常检测的一种常见方法是使用聚类等无监督学习技术,将少数类别的观测值基于其相似性聚类成不同的组。不属于这些聚类之一的少数类别观测值可以被标记为异常值。

另一种方法是使用单类别分类等监督学习技术,其中使用多数类别数据训练模型来学习数据的正常行为。然后将与学习到的正常行为显著偏离的少数类别观测值标记为异常值。

from sklearn.ensemble import IsolationForest


# Use anomaly detection to handle imbalance
clf = IsolationForest(random_state=42)
clf.fit(X_train)
X_train = X_train[clf.predict(X_train) == 1]
y_train = y_train[clf.predict(X_train) == 1]

6.成本敏感学习(Cost-Sensitive Learning):成本敏感学习将不同类型的错误分配不同的成本以考虑不平衡性。可以使用模型中的 sample_weight 参数来实现。

在成本敏感学习中,模型会为每个类别分配一个成本权重。这些成本权重反映了在模型中犯错的代价。通常,少数类别的成本权重比多数类别的成本权重高,以强制模型更加关注少数类别。这可以通过调整 sample_weight 参数来实现。

from sklearn.tree import DecisionTreeClassifier


# Use cost-sensitive learning to handle imbalance
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train, sample_weight=class_weights)
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分