paint-brush
特征工程初学者指南经过@dotslashbit
747 讀數
747 讀數

特征工程初学者指南

经过 Sahil9m2023/08/21
Read on Terminal Reader

太長; 讀書

在机器学习和数据科学领域,特征工程是模型性能改进的基石。虽然算法和模型经常引起人们的关注,但精心设计的功能为预测能力奠定了基础。想象一下,试图在薄弱的地基上建造一座房子——如果没有强大的功能,即使是最先进的算法在面对复杂的数据集时也可能崩溃。
featured image - 特征工程初学者指南
Sahil HackerNoon profile picture
0-item


在机器学习和数据科学领域,特征工程是模型性能改进的基石。虽然算法和模型经常引起人们的关注,但精心设计的功能为预测能力奠定了基础。想象一下,试图在薄弱的地基上建造一座房子——如果没有强大的功能,即使是最先进的算法在面对复杂的数据集时也可能崩溃。

了解特征工程

特征工程是从原始数据中选择、转换和创建特征(输入变量)以最大化模型性能的创造性和战略性过程。这是将数据转化为可操作的见解的艺术,为机器提供做出准确预测所需的上下文理解。无论是预测房价、对客户偏好进行分类,还是诊断医疗状况,特征工程都是释放数据中隐藏潜力的关键。

精心制作的重要性

想象一下,您的任务是根据多种因素预测房价。您最初可能会被诸如平方英尺、卧室数量和位置等明显特征所吸引。然而,特征工程的魔力在于挖掘影响目标变量的更微妙的方面。卫生间与卧室的比例对价格有影响吗?壁炉的存在或屋顶的年龄怎么样?


特征工程不仅仅是创造更多的特征;这是关于辨别数据的哪些方面真正重要。这个过程通常需要领域知识、创造力以及对您正在解决的问题的深刻理解。通过完善现有功能并创建新功能,您实际上是在教您的模型像专家一样理解数据。

为什么要关心特征工程?

答案在于模型性能。精心设计的特征可以在训练过程中实现更快的收敛,减少过度拟合,并最终实现更准确的预测。机器学习模型的好坏取决于它所输入的数据,而精心设计的功能可以提供更丰富、更细致的数据表示。


在本文中,我们将使用 Kaggle 的高级房价预测数据集深入研究特征工程的世界。通过继续学习,您将深入了解可以将原始数据转换为有价值的预测变量的各种技术,并且您将看到如何通过应用不同的特征工程方法来改进模型的结果。


因此,事不宜迟,让我们开始学习特征工程的不同方法。

方法

现在我们已经做好了准备,是时候深入研究先进特征工程技术的令人兴奋的世界了。在本节中,我将指导您逐步实施四种强大的方法,这些方法可以增强您的预测模型。每种方法都有其独特的用途,提供可以对模型性能产生重大影响的见解和改进。

方法一:互信息——从关系中提取信息

想象一下能够以外科手术般的精度为您的模型选择最有影响力的特征。互信息可以让您实现这一目标。通过量化每个特征与目标变量之间的关系,您可以确定影响预测的关键因素。我们将引导您完成代码并提供每个步骤的详细说明,帮助您掌握这项富有洞察力的技术。

方法2:聚类——通过分组发现模式

集群通常隐藏数据中有价值的模式。通过聚类,您可以发现这些隐藏的宝石并利用它们来增强模型的理解。我将指导您完成应用 KMeans 聚类将相似实例分组在一起的过程。您将学习如何基于这些集群创建新特征并观察它们对模型性能的影响。

方法三:PCA降维——压缩复杂度

高维数据可能令人难以承受,但主成分分析 (PCA) 提供了解决方案。通过识别最具影响力的维度,您可以在不牺牲预测能力的情况下降低复杂性。本教程将引导您使用 PCA 转换数据,深入了解该技术如何在保持其准确性的同时简化您的模型。


除了这些方法之外,我还将向您介绍数学转换——一种经常被忽视的技术,但它可以产生强大的结果。通过对选定的列应用数学运算,您可以调整数据以更好地符合模型的假设。您将探索对数、平方根和逆变换,说明它们如何揭示隐藏的关系并提高模型的准确性。


在本节中,我将提供全面的解释,以确保您不仅掌握技术方面,而且了解每种方法应用背后的推理。最后,您将获得一个有价值的高级特征工程技术工具包,可以自信地应用这些技术来增强各种场景中的预测模型。


您准备好探索每种方法的复杂性,发掘其潜力,并利用专业知识来设计可转化为更准确、更强大的预测模型的功能了吗?让我们开始这个启蒙之旅吧!

代码

导入包

让我们首先导入您需要的所有包。

 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.feature_selection import SelectKBest, mutual_info_regression from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.preprocessing import LabelEncoder, StandardScaler import numpy as np

获取数据

现在,让我们从 kaggle 获取数据集并对其进行预处理。

 # Load the dataset data = pd.read_csv('train.csv') # Data preprocessing def preprocess_data(df): # Handle missing values df = df.fillna(df.median()) # Handle categorical variables df = pd.get_dummies(df, drop_first=True) return df data = preprocess_data(data) # Prepare the data X = data.drop('SalePrice', axis=1) y = data['SalePrice'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


首先,让我们运行一个没有任何特征工程的基线模型并评估其准确性。之后,我们将分别应用四种特征工程方法(互信息、聚类、PCA 降维和标签编码),并比较它们对模型性能的影响。

基线模型

在应用任何特征工程之前,我们将从基线模型开始。在这里,我们将使用一个简单的线性回归模型来使用原始数据集来预测房价。

 baseline_model = LinearRegression() baseline_model.fit(X_train, y_train) baseline_predictions = baseline_model.predict(X_test) baseline_rmse = mean_squared_error(y_test, baseline_predictions, squared=False) print(f"Baseline RMSE: {baseline_rmse}") # ------------------ OUTPUT ---------------- # Baseline RMSE: 49204.92

在基线模型中,您从一个简单的线性回归模型开始,该模型按原样使用原始特征。您使用训练数据训练模型,对测试数据进行预测,并计算均方根误差 (RMSE) 以衡量模型在未见过的数据上的表现。

互信息模型

# Method 1: Mutual Information mi_selector = SelectKBest(score_func=mutual_info_regression, k=10) X_train_mi = mi_selector.fit_transform(X_train, y_train) X_test_mi = mi_selector.transform(X_test) mi_model = LinearRegression() mi_model.fit(X_train_mi, y_train) mi_predictions = mi_model.predict(X_test_mi) mi_rmse = mean_squared_error(y_test, mi_predictions, squared=False) print(f"Mutual Information RMSE: {mi_rmse}") # ------------------ OUTPUT ----------------- # Mutual Information RMSE: 39410.99

在这里,您正在探索每个功能提供的有关目标变量的信息。您选择与目标互信息得分最高的前 10 个特征。然后,您仅使用这些选定的特征来训练新的线性回归模型。这有助于确保您的模型专注于信息最丰富的特征,并且您可以计算 RMSE 以了解该模型的预测与基线的比较情况。

聚类模型

# Method 2: Clustering num_clusters = 5 kmeans = KMeans(n_clusters=num_clusters, random_state=42) X_clustered = X.copy() X_clustered['Cluster'] = kmeans.fit_predict(X) X_clustered = pd.get_dummies(X_clustered, columns=['Cluster'], prefix='Cluster') X_train_clustered, X_test_clustered, _, _ = train_test_split(X_clustered, y, test_size=0.2, random_state=42) cluster_model = LinearRegression() cluster_model.fit(X_train_clustered, y_train) cluster_predictions = cluster_model.predict(X_test_clustered) cluster_rmse = mean_squared_error(y_test, cluster_predictions, squared=False) print(f"Clustering RMSE: {cluster_rmse}") # ------------------- OUTPUT -------------- # Clustering RMSE: 47715.30

您正在考虑使用聚类对数据中的相似实例进行分组。具体来说,您使用 KMeans 算法将数据划分为集群。每个实例都分配给一个集群,并且您可以将此集群信息添加为新的分类特征。通过这样做,您为模型提供了一种根据集群来考虑实例之间关系的方法。在此聚类数据上训练线性回归模型后,您可以计算 RMSE 以评估其性能。

PCA - 降维模型

# Method 3: PCA Dimensionality Reduction scaler = StandardScaler() X_scaled = scaler.fit_transform(X_train) pca = PCA(n_components=10) X_train_pca = pca.fit_transform(X_scaled) X_test_pca = pca.transform(scaler.transform(X_test)) pca_model = LinearRegression() pca_model.fit(X_train_pca, y_train) pca_predictions = pca_model.predict(X_test_pca) pca_rmse = mean_squared_error(y_test, pca_predictions, squared=False) print(f"PCA RMSE: {pca_rmse}") # --------------- OUTPUT -------------- # PCA RMSE: 40055.78

PCA 通过将数据汇总为更少的维度来帮助您降低数据的复杂性。您可以对数据进行标准化,以确保所有特征都处于同一规模。然后,您使用 PCA 来识别数据中最重要的模式,并将特征数量减少到 10 个主成分。在这些组件上训练线性回归模型,您可以在简化模型的同时捕获最重要的信息。 RMSE 可帮助您衡量此方法是否有效。

数学转换模型

# Method 5: Mathematical Transformations X_train_transformed = X_train.copy() X_test_transformed = X_test.copy() # Apply logarithmic transformation log_columns = ['GrLivArea', 'LotArea'] # Specify columns to apply log transformation X_train_transformed[log_columns] = np.log1p(X_train_transformed[log_columns]) X_test_transformed[log_columns] = np.log1p(X_test_transformed[log_columns]) # Apply square root transformation sqrt_columns = ['GarageArea', '1stFlrSF'] # Specify columns to apply square root transformation X_train_transformed[sqrt_columns] = np.sqrt(X_train_transformed[sqrt_columns]) X_test_transformed[sqrt_columns] = np.sqrt(X_test_transformed[sqrt_columns]) # Apply inverse transformation inv_columns = ['YearBuilt', 'OverallQual'] # Specify columns to apply inverse transformation X_train_transformed[inv_columns] = 1 / X_train_transformed[inv_columns] X_test_transformed[inv_columns] = 1 / X_test_transformed[inv_columns] math_transform_model = LinearRegression() math_transform_model.fit(X_train_transformed, y_train) math_transform_predictions = math_transform_model.predict(X_test_transformed) math_transform_rmse = mean_squared_error(y_test, math_transform_predictions, squared=False) print(f"Mathematical Transformations RMSE: {math_transform_rmse}") # ------------------ OUTPUT --------------- # Mathematical Transformations RMSE: 47143.21


数学转换涉及使用数学运算改变特征值以得出潜在的模式。您可以对特定列应用对数、平方根和逆变换。例如,对数变换有助于标准化倾斜数据,平方根变换可以帮助处理异常值,而逆变换可以强调与小值的关系。您使用这些转换后的特征训练线性回归模型,并计算 RMSE 以评估转换是否提高了模型的预测能力。


在所有这些方法中,您正在尝试不同的技术以使您的数据更适合建模。目标是找到导致 RMSE 最低的方法,表明模型的预测更接近实际目标值,因此更准确。

比较结果

  1. 基线 RMSE:49204.92这是基线模型的均方根误差 (RMSE),其中未应用特征工程或转换。该模型按原样使用原始特征。 RMSE 为 49204.92,表示基线模型对测试数据的平均预测误差。


  2. 互信息 RMSE:39410.99该 RMSE 表示应用互信息特征选择方法后模型的性能。它显着低于基线 RMSE,表明根据互信息分数选择前 k 个特征可以提高模型性能。


  3. 聚类 RMSE:47715.30这里的 RMSE 对应于引入基于聚类的新分类特征后模型的性能。 RMSE 接近基线 RMSE,表明在这种情况下引入聚类并没有带来显着的改进。


  4. PCA RMSE:40055.78该 RMSE 反映了应用 PCA 降维后模型的性能。它比互信息 RMSE 稍高,但低于基线 RMSE。使用 PCA 转换特征的模型似乎表现不错。


  5. 标签编码 RMSE:49204.92这里的 RMSE 显示了对分类变量进行标签编码时模型的性能。 RMSE 与基线 RMSE 匹配,表明在这种情况下使用标签编码特征并没有带来明显的改进。


  6. 数学转换 RMSE:47143.21此 RMSE 表示对选定列应用各种数学转换后模型的性能。 RMSE 低于基线 RMSE,表明这些转换提高了模型性能。


总之:


  • 互信息似乎是所尝试的方法中最有效的特征选择方法,因为它显着降低了 RMSE。
  • 与基线相比, PCA数学转换都提高了模型性能。
  • 在此特定场景中,集群并没有显示出显着的改进。


请记住,实际 RMSE 值及其解释取决于各种因素,例如数据集、模型的复杂性以及目标变量的性质。目标是尝试不同的特征工程方法,并选择一种能够在未见过的数据上实现最佳性能的方法。