趋近智
对数据集的分析常会显现分类特征,这些变量表示诸如“城市”、“产品类型”或“客户细分”等组别或标签。尽管这些类别对我们有意义,但大多数机器学习 (machine learning)算法主要处理数值数据。因此,将这些分类特征转换为数值格式是特征工程中一个标准且必需的步骤,这直接依据我们在单变量和双变量分析中获得的关于这些类别性质和分布的见解。这个过程称为编码。
机器学习 (machine learning)模型是数学函数。它们通过对输入数字进行计算来学习模式。像“纽约”、“伦敦”或“东京”这样的文本类别不能直接代入这些计算中。编码将这些标签转换为数字,使算法能够理解它们。选择合适的编码方法非常重要,因为不同方法会影响模型性能。
对分类数据进行编码没有唯一最佳方式。最优选择取决于特征的具体属性(例如唯一类别的数量或是否存在固有顺序)以及您稍后打算使用的机器学习 (machine learning)模型的要求。接下来,我们查看一些常见技术。
标签编码为每个类别分配一个唯一的整数。例如,如果特征“温度”有“低”、“中”和“高”这些类别,标签编码可能会将0分配给“低”,1分配给“中”,2分配给“高”。
实现范例(Pandas):
import pandas as pd
# 示例DataFrame
df = pd.DataFrame({'Temperature': ['High', 'Low', 'Medium', 'Low', 'High']})
# 使用类别代码应用标签编码
df['Temperature_Encoded'] = df['Temperature'].astype('category').cat.codes
print(df)
# Temperature Temperature_Encoded
# 0 High 0 <- 注意:Pandas默认按字母顺序分配代码
# 1 Low 1
# 2 Medium 2
# 3 Low 1
# 4 High 0
# 对于序数数据,显式控制顺序:
temp_order = ['Low', 'Medium', 'High']
df['Temperature'] = pd.Categorical(df['Temperature'], categories=temp_order, ordered=True)
df['Temperature_Ordinal_Encoded'] = df['Temperature'].cat.codes
print("\n序数编码:")
print(df)
# 序数编码:
# Temperature Temperature_Encoded Temperature_Ordinal_Encoded
# 0 High 0 2
# 1 Low 1 0
# 2 Medium 2 1
# 3 Low 1 0
# 4 High 0 2
独热编码可能是最常见且普遍推荐的方法,特别是对于名义分类特征。它将每个类别值转换为一个新的二元列(只包含0或1)。
独热编码将“颜色”特征转换为三个新的二元特征。
实现范例(Pandas):
import pandas as pd
# 示例DataFrame
df = pd.DataFrame({'Color': ['Red', 'Blue', 'Green', 'Red']})
# 应用独热编码
df_encoded = pd.get_dummies(df, columns=['Color'], prefix='Color')
print(df_encoded)
# Color_Blue Color_Green Color_Red
# 0 0 0 1
# 1 1 0 0
# 2 0 1 0
# 3 0 0 1
pd.get_dummies函数对此非常方便。您也可以使用sklearn.preprocessing.OneHotEncoder,它能更好地集成到Scikit-learn管道中,特别是在确保训练和测试数据分割之间编码一致性方面。
此方法用每个类别在数据集中出现的频率(计数)替换该类别。
实现范例(Pandas):
import pandas as pd
# 示例DataFrame
df = pd.DataFrame({'City': ['London', 'Paris', 'London', 'Tokyo', 'Paris', 'London']})
# 计算频率
city_freq = df['City'].value_counts()
# 将频率映射到列
df['City_Freq_Encoded'] = df['City'].map(city_freq)
print(df)
# City City_Freq_Encoded
# 0 London 3
# 1 Paris 2
# 2 London 3
# 3 Tokyo 1
# 4 Paris 2
# 5 London 3
目标编码用与每个类别相关的目标变量的平均值替换该类别。例如,如果对“城市”进行编码且目标是“购买金额”,则“伦敦”将被替换为所有来自伦敦客户的平均购买金额。
由于存在数据泄露的风险,简单的实现通常不足以进行可靠的模型构建。正确应用通常涉及诸如K折目标编码之类的技术。
选择合适的编码方法是特征工程过程的一部分,依据您的EDA(探索性数据分析)来确定:
尽管Pandas(pd.get_dummies、.map、.astype('category').cat.codes)提供了快速执行编码的方法,但对于构建机器学习 (machine learning)模型而言,在管道(sklearn.pipeline.Pipeline)中使用Scikit-learn的转换器(OneHotEncoder、LabelEncoder、OrdinalEncoder)通常更受青睐。这可确保从训练数据中学到的编码被一致地应用于验证和测试数据,从而防止错误和数据泄露。
对分类特征进行编码是连接数据分析和模型准备的基本步骤。通过慎重地使用标签编码、独热编码或其他方法将类别转换为数字,您可以使数据适用于机器学习算法,为获取预测性信息铺平道路。方法的选择应由您通过详尽的EDA(探索性数据分析)获得的对数据的理解以及后续建模任务的要求来引导。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•