🐋模型迭代优化相关知识点
本人在优化baseline的过程中,虽然借助GPT找到了部分相关代码,但是却没有系统的学习过有关知识,下面是对任务三涉及到的知识进行了相对之前较为系统的整理,并附上相关代码例子,希望在学习中实践,在实践中学习,获得一定的提升。
🐋1.特征选择与删除
特征选择是指通过选择有意义和对目标变量有影响的特征来构建模型,以提高模型效果和降低计算复杂度。特征删除是指删除对模型没有贡献或重复信息较多的特征,以简化模型和提高计算效率。下面是几种常见的特征选择和删除方法以及相应的代码示例:
- 过滤式特征选择:
过滤式特征选择是在特征选择和模型训练之前独立地评估每个特征的重要性,并根据指定的评估指标进行特征选择。
from sklearn.feature_selection import SelectKBest, f_regression
# 使用F检验选择K个最好的特征
k = 5
selector = SelectKBest(score_func=f_regression, k=k)
selected_features = selector.fit_transform(X, y)
- 包裹式特征选择:
包裹式特征选择是将特征选择和模型选择结合在一起,通过逐步搜索特征子集并在每一步中训练模型来选择最佳特征子集。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 使用递归特征消除选择最佳特征子集
estimator = LogisticRegression()
n_features = 5
selector = RFE(estimator, n_features_to_select=n_features)
selected_features = selector.fit_transform(X, y)
- 嵌入式特征选择:
嵌入式特征选择是将特征选择嵌入到模型训练的过程中,通过选择合适的正则化参数来调整特征的权重。
from sklearn.linear_model import LassoCV
# 使用Lasso回归选择特征
estimator = LassoCV()
estimator.fit(X, y)
selected_features = X[:, estimator.coef_ != 0]
- 相关性删除:
通过计算特征与目标变量之间的相关性来判断特征的重要性,可以删除与目标变量相关性较低的特征。
import pandas as pd
# 计算特征与目标变量之间的相关性
correlation = data.corr()['target']
# 根据相关性阈值删除特征
threshold = 0.5
selected_features = correlation[correlation.abs() > threshold].index
- 基于模型的特征选择:
通过使用一个预测模型训练的特征重要性来选择特征,可以删除对模型预测效果不重要的特征。
from sklearn.ensemble import RandomForestClassifier
# 训练随机森林模型获取特征重要性
model = RandomForestClassifier()
model.fit(X, y)
importance = model.feature_importances_
# 根据重要性阈值选择特征
threshold = 0.1
selected_features = X[:, importance > threshold]
特征选择和删除方法的选择需要根据数据的特性、问题的需求和模型的要求进行决策。不同的方法可能适用于不同的情况,需要进行适当的调整和验证,以达到提高模型效果和降低计算复杂度的目标。
🐋2.特征组合与交互
特征组合和交互是指将原始特征进行组合或相互作用,以创建新的特征来丰富模型的表示能力。特征组合是将多个特征组合在一起形成一个新的特征值,而特征交互是指将多个特征进行相互作用,例如求和、相乘等操作,从而得到新的特征值。下面是几种常见的特征组合和交互方法以及相应的代码示例:
- 多项式特征组合:
多项式特征组合通过将特征进行多项式扩展,生成多项式组合的新特征,以增加对非线性关系的建模能力。
from sklearn.preprocessing import PolynomialFeatures
# 使用多项式特征扩展进行特征组合
degree = 2
poly = PolynomialFeatures(degree=degree, include_bias=False)
X_poly = poly.fit_transform(X)
- 文本特征的组合与交互:
对于文本特征,可以使用词袋模型、TF-IDF等技术将文本特征转化为数值特征,然后进行特征组合与交互。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
# 使用词袋模型进行特征组合
vectorizer = CountVectorizer(ngram_range=(1,2))
X_bag_of_words = vectorizer.fit_transform(text_data)
# 使用TF-IDF进行特征交互
vectorizer = TfidfVectorizer(ngram_range=(1,2))
X_tfidf = vectorizer.fit_transform(text_data)
- 时间特征的交互:
对于时间特征,可以提取出年、月、日、小时等时间单位,并进行特征组合与交互。
import pandas as pd
# 提取时间特征
data['year'] = data['date'].dt.year
data['month'] = data['date'].dt.month
data['day'] = data['date'].dt.day
# 进行时间特征交互
data['year_month'] = data['year'].astype(str) + '/' + data['month'].astype(str)
- 特征组合的基于距离的方法:
对于连续型特征,可以使用聚类方法将数据点划分为多个簇,然后将数据点与各个簇中心的距离作为新的特征。
from sklearn.cluster import KMeans
# 使用K-means进行特征组合
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(X)
cluster_centers = kmeans.cluster_centers_
distances = kmeans.transform(X)
# 添加距离特征
X_new = np.hstack((X, distances))
特征组合和交互方法的选择需要根据数据的特性、问题的需求和模型的要求进行决策。不同的方法可能适用于不同的情况,需要进行适当的调整和验证,以达到提高模型表示能力的目标。
🐋3.数值型特征分桶
数值型特征的分桶(也称为分箱、离散化)是将连续型的数值特征划分为若干个离散的桶或区间,以提高模型对非线性关系的建模能力,并解决极端值和异常值的影响。分桶方法可以根据不同的需求选择,包括等宽分桶、等频分桶、基于统计量的分桶等。下面是几种常见的数值型特征分桶方法以及相应的代码示例:
- 等宽分桶:
等宽分桶是将数值范围等分为若干个桶,每个桶的范围是相等的,适用于特征的取值分布比较均匀的情况。
import pandas as pd
# 使用pandas的cut函数进行等宽分桶
num_bins = 5
data['bucket'] = pd.cut(data['feature'], bins=num_bins, labels=False)
- 等频分桶:
等频分桶是将数值分布按照频率等分为若干个桶,每个桶中包含相等数量的样本,适用于特征的取值分布不均匀的情况。
import pandas as pd
# 使用pandas的qcut函数进行等频分桶
num_bins = 5
data['bucket'] = pd.qcut(data['feature'], q=num_bins, labels=False)
- 基于统计量的分桶:
基于统计量的分桶是根据特征的分布来划分桶的,可以根据分位数、均值、标准差等统计量进行分桶。
import numpy as np
# 使用numpy的percentile函数进行基于分位数的分桶
percentiles = [0, 20, 40, 60, 80, 100]
bin_edges = np.percentile(data['feature'], q=percentiles)
data['bucket'] = pd.cut(data['feature'], bins=bin_edges, labels=False)
- 自定义分桶:
自定义分桶是根据业务知识或领域经验来定义分桶的边界,可以根据实际需求对特征进行分桶。
import pandas as pd
# 使用自定义边界进行分桶
bin_edges = [-float('inf'), 0, 50, float('inf')]
data['bucket'] = pd.cut(data['feature'], bins=bin_edges, labels=False)
数值型特征分桶的选择和设计需要根据数据的特性、问题的需求和模型的要求进行决策。不同的分桶方法可能适用于不同的情况,需要进行适当的调整和验证,以达到提高模型的非线性建模能力和处理极端值的目标。
🐋4.类别型特征编码
类别型特征的编码是将离散的类别型特征转化为数值型特征,以便于机器学习算法的处理。编码的目的是将类别信息转化为特征的数值表示,使得算法能够更好地理解和利用这些特征。有多种编码方法可供选择,包括独热编码、标签编码、目标编码等。下面是几种常见的类别型特征编码方法以及相应的代码示例:
- 独热编码(One-Hot Encoding):
独热编码是将一个类别型特征拆分成多个二进制特征,每个特征代表一个原始特征的取值,如果某个样本的原始特征取了某个值,则对应的二进制特征值为1,其余二进制特征值为0。
from sklearn.preprocessing import OneHotEncoder
# 使用sklearn的OneHotEncoder进行独热编码
encoder = OneHotEncoder()
X_encoded = encoder.fit_transform(X)
- 标签编码(Label Encoding):
标签编码是将每个类别的取值映射到一个整数值,将类别型特征的取值用整数表示,但不增加新的特征维度。
from sklearn.preprocessing import LabelEncoder
# 使用sklearn的LabelEncoder进行标签编码
encoder = LabelEncoder()
X_encoded = encoder.fit_transform(X)
- 目标编码(Target Encoding):
目标编码是将类别型特征的每个取值的平均目标值(响应变量)编码为一个数值特征,以捕捉类别值与目标之间的关系。
import pandas as pd
# 使用pandas进行目标编码
target_mean = data.groupby('category')['target'].mean()
data['target_encoded'] = data['category'].map(target_mean)
- 二进制编码(Binary Encoding):
二进制编码是将类别型特征的每个取值转化为二进制编码的形式,将类别值映射为一系列二进制特征的组合。
import category_encoders as ce
# 使用category_encoders的BinaryEncoder进行二进制编码
encoder = ce.BinaryEncoder(cols='category')
X_encoded = encoder.fit_transform(X)
类别型特征的编码方法的选择需要根据数据的特性、问题的需求和模型的要求进行决策。不同的编码方法可能适用于不同的情况,需要进行适当的调整和验证,以达到提高模型的表达能力和处理类别型特征的目标。
🐋5.时间特征的挖掘
类别型特征的编码是将离散的类别型特征转化为数值型特征,以便于机器学习算法的处理。编码的目的是将类别信息转化为特征的数值表示,使得算法能够更好地理解和利用这些特征。有多种编码方法可供选择,包括独热编码、标签编码、目标编码等。下面是几种常见的类别型特征编码方法以及相应的代码示例:
- 独热编码(One-Hot Encoding):
独热编码是将一个类别型特征拆分成多个二进制特征,每个特征代表一个原始特征的取值,如果某个样本的原始特征取了某个值,则对应的二进制特征值为1,其余二进制特征值为0。
from sklearn.preprocessing import OneHotEncoder
# 使用sklearn的OneHotEncoder进行独热编码
encoder = OneHotEncoder()
X_encoded = encoder.fit_transform(X)
- 标签编码(Label Encoding):
标签编码是将每个类别的取值映射到一个整数值,将类别型特征的取值用整数表示,但不增加新的特征维度。
from sklearn.preprocessing import LabelEncoder
# 使用sklearn的LabelEncoder进行标签编码
encoder = LabelEncoder()
X_encoded = encoder.fit_transform(X)
- 目标编码(Target Encoding):
目标编码是将类别型特征的每个取值的平均目标值(响应变量)编码为一个数值特征,以捕捉类别值与目标之间的关系。
import pandas as pd
# 使用pandas进行目标编码
target_mean = data.groupby('category')['target'].mean()
data['target_encoded'] = data['category'].map(target_mean)
- 二进制编码(Binary Encoding):
二进制编码是将类别型特征的每个取值转化为二进制编码的形式,将类别值映射为一系列二进制特征的组合。
import category_encoders as ce
# 使用category_encoders的BinaryEncoder进行二进制编码
encoder = ce.BinaryEncoder(cols='category')
X_encoded = encoder.fit_transform(X)
类别型特征的编码方法的选择需要根据数据的特性、问题的需求和模型的要求进行决策。不同的编码方法可能适用于不同的情况,需要进行适当的调整和验证,以达到提高模型的表达能力和处理类别型特征的目标。
6.特征缩放
特征缩放(Feature Scaling)是指将特征的值映射到一个特定的范围内,以便于不同尺度的特征能够更好地进行比较和处理。特征缩放在机器学习中是一个常见的预处理步骤,可以提高模型的准确性和训练效率。常见的特征缩放方法包括标准化(Standardization)和归一化(Normalization)。下面是对这两种方法的详细介绍以及代码示例:
- 标准化(Standardization):
标准化是将特征的值转化为标准正态分布,均值为0,标准差为1,公式为:(x - mean) / std。标准化对异常值的影响较小,适用于大多数机器学习算法。
from sklearn.preprocessing import StandardScaler
# 使用sklearn的StandardScaler进行标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- 归一化(Normalization):
归一化是将特征的值缩放到一个指定的范围内,通常是[0, 1]或[-1, 1],公式为:(x - min) / (max - min)。归一化对异常值的影响较大,适用于某些特定的算法,如神经网络。
from sklearn.preprocessing import MinMaxScaler
# 使用sklearn的MinMaxScaler进行归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
特征缩放的选择取决于数据的特性、算法的要求以及个人的偏好。某些算法对特征缩放较为敏感,因此在使用这些算法之前,特征缩放是一个重要的步骤。在实际应用中,需要针对具体数据进行分析和实验,以找到最适合数据和模型的特征缩放方法。