独热编码可提高机器学习性能
独热编码对于机器学习至关重要,因为它允许算法解释分类变量。这种方法通过将每个类别表示为二进制向量,使其处理变得简单。为了提高机器学习速度,我们的博客文章概述了独热编码,并提供了一个带有示例数据和代码的实用项目。
什么是独热编码?
一种用于表达分类数据以便机器学习算法可以快速分析的技术被称为"独热编码"。这种方法将每个类别转换为长度等于类别数量的二进制向量。
独热编码如何提高机器学习性能?
独热编码是机器学习模型中分类变量的预处理技术。为了使计算机学习系统能够快速处理类别信息,必须将其转换为数值变量。这很重要,因为大多数机器学习算法不能直接解释类别数据,而是需要数字输入变量。
是的,让我们看一个数据集,其中分类变量"水果"的可能值为"苹果"、"香蕉"或"橙子"。下表可以显示此数据集 −
Index |
Fruits |
Price |
---|---|---|
0 |
apple |
1.2 |
1 |
banana |
0.9 |
2 |
orange |
1.1 |
3 |
apple |
1.4 |
4 |
banana |
1.0 |
为了对"水果"变量应用独热编码,我们首先创建三个新的二进制变量"水果苹果"、"水果香蕉"和"水果橙"。然后,对于初始数据集中的每一行,如果存在正确的类别,则将二进制变量的值设置为 1,否则设置为 0。独热编码后的最终表格如下所示 -
水果苹果 | 水果香蕉 | 水果橙 | 价格 |
---|---|---|---|
1 | 0 | 0 | 1.2 |
0 | 1 | < td>00.9 | |
0 | 0 | 1 | 1.1 |
1 | 0 | 0 | 1.4 |
0 | 1 | 0 | 1.0 |
我们可以看到,类别变量"水果"已被拆分为三个二进制变量,以便机器学习算法更容易理解它们。
机器学习系统现在可以理解每种水果品种与价格之间的相关性,并通过独热编码产生更精确的预测。
使用独热编码通过随机森林算法提高机器学习性能
我们研究如何在处理分类数据时使用独热编码来提高机器学习效率。我们将生成一个新的数据集,使用独热编码转换分类变量,并使用随机森林方法来训练机器学习模型。我们的项目将使用 Python 和 scikit-learn 框架实现。
导入库和创建数据集
让我们首先构建一个包含四个变量"大小"、"价格"、"位置"和"卧室"的新数据集。分类"位置"变量有三个潜在值:"A"、"B"和"C",而分类"卧室"变量有四个可能的值:"1"、"2"、"3"和"4"。
import pandas as pd import numpy as np # create new dataset df = pd.DataFrame({ 'Size': [1381, 4057, 3656, 2468, 2828, 4385, 2006, 1915, 1593, 2929], 'Price': [125527, 416447, 150528, 320128, 232294, 284386, 292693, 320596, 201712, 324857], 'Location': ['A', 'C', 'B', 'B', 'A', 'C', 'A', 'C', 'B', 'C'], 'Bedrooms': ['1', '2', '4', '4', '3', '1', '1', '2', '3', '2'] }) # display dataset print(df)
输出
Size Price Location Bedrooms 0 1381 125527 A 1 1 4057 416447 C 2 2 3656 150528 B 4 3 2468 320128 B 4 4 2828 232294 A 3 5 4385 284386 C 1 6 2006 292693 A 1 7 1915 320596 C 2 8 1593 201712 B 3 9 2929 324857 C 2
应用单热编码
分类变量"位置"和"卧室"随后将使用单热编码进行更改。此更新将使用 Python 中的 pandas 库进行。
# 执行独热编码 one_hot_location = pd.get_dummies(df['Location'], prefix='Location') one_hot_bedrooms = pd.get_dummies(df['Bedrooms'], prefix='Bedrooms') # 将独热编码与原始数据框连接起来 df = pd.concat([df, one_hot_location, one_hot_bedrooms], axis=1) # 删除原始分类变量 df = df.drop(['Location', 'Bedrooms'], axis=1) # 显示更新后的数据集 print(df)
输出
Size Price Location_A Location_B Location_C Bedrooms_1 Bedrooms_2 \ 0 1381 125527 1 0 0 1 0 1 4057 416447 0 0 1 0 1 2 3656 150528 0 1 0 0 0 3 2468 320128 0 1 0 0 0 4 2828 232294 1 0 0 0 0 5 4385 284386 0 0 1 1 0 6 2006 292693 1 0 0 1 0 7 1915 320596 0 0 1 0 1 8 1593 201712 0 1 0 0 0 9 2929 324857 0 0 1 0 1 Bedrooms_3 Bedrooms_4 0 0 0 1 0 0 2 0 1 3 0 1 4 1 0 5 0 0 6 0 0 7 0 0 8 1 0 9 0 0
机器学习模型
更改类别数据后,我们现在可以使用随机森林方法创建机器学习模型。我们将从数据集中创建训练集和测试集。
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score # 将数据集拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(df.drop(['Price'], axis=1), df['Price'], test_size=0.3, random_state=0) # 在训练集上训练随机森林模型 rf = RandomForestRegressor(n_estimators=100, random_state=0) rf.fit(X_train, y_train) # 在测试集上评估随机森林模型 y_pred = rf.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = mean_squared_error(y_test, y_pred, squared=False) r2 = r2_score(y_test, y_pred) print('均方误差:', mse) print('均方根误差:', rmse) print('R 平方得分:', r2)
输出
均方误差:12664984402.161505 均方根误差:112538.81286987838 R 平方得分:-10.130530314227844
在这里,我们可以看到我们的模型表现相当不错,均方根误差约为 12664984402,R 平方得分约为 -10.1。我们可以尝试其他随机森林算法超参数、特征工程和其他方法来进一步增强模型的性能,但仍有改进空间。
结论
总之,机器学习从业者必须了解独热编码的好处、局限性和最佳实践,才能成功应用它。通过将独热编码与其他技术相结合,我们可以创建准确可靠的机器学习模型,帮助我们解决各种实际问题。