独热编码提升机器学习性能
独热编码对于机器学习至关重要,因为它允许算法解释分类变量。这种方法通过将每个类别表示为二进制向量来简化处理。为了提高机器学习速度,我们的博客文章概述了独热编码,并提供了一个包含示例数据和代码的实践项目。
什么是独热编码?
“独热编码”是一种表示分类数据以使机器学习算法能够快速分析的技术。这种方法将每个类别转换为长度等于类别数的二进制向量。
独热编码如何提升机器学习性能?
独热编码是一种用于机器学习模型中分类变量的预处理技术。为了让机器学习系统快速处理类别信息,必须将其转换为数值变量。这很重要,因为大多数机器学习算法无法直接解释类别数据,而是需要数值输入变量。
是的,让我们来看一个数据集,其中分类变量“水果”的可能值为“苹果”、“香蕉”或“橙子”。下表可以显示此数据集:
索引 |
水果 |
价格 |
---|---|---|
0 |
苹果 |
1.2 |
1 |
香蕉 |
0.9 |
2 |
橙子 |
1.1 |
3 |
苹果 |
1.4 |
4 |
香蕉 |
1.0 |
为了在“水果”变量上应用独热编码,我们首先创建三个新的二进制变量“水果_苹果”、“水果_香蕉”和“水果_橙子”。然后,对于初始数据集中的每一行,如果存在正确的类别,则将二进制变量的值设置为 1,否则设置为 0。独热编码后的最终表如下所示:
水果_苹果 | 水果_香蕉 | 水果_橙子 | 价格 |
---|---|---|---|
1 | 0 | 0 | 1.2 |
0 | 1 | 0 | 0.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 库进行。
# performing one hot encoding one_hot_location = pd.get_dummies(df['Location'], prefix='Location') one_hot_bedrooms = pd.get_dummies(df['Bedrooms'], prefix='Bedrooms') # concatenating one hot encoding with original dataframe df = pd.concat([df, one_hot_location, one_hot_bedrooms], axis=1) # droping original categorical variables df = df.drop(['Location', 'Bedrooms'], axis=1) # displaying updated dataset 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 # spliting dataset into training set and test set 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) # training Random Forest model on training set rf = RandomForestRegressor(n_estimators=100, random_state=0) rf.fit(X_train, y_train) # evaluating Random Forest model on test set 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('Mean Squared Error:', mse) print('Root Mean Squared Error:', rmse) print('R-squared score:', r2)
输出
Mean Squared Error: 12664984402.161505 Root Mean Squared Error: 112538.81286987838 R-squared score: -10.130530314227844
在这里,我们可以看到我们的模型表现相当不错,均方根误差约为 12664984402,R 平方分数约为 -10.1。我们可以尝试其他随机森林算法超参数、特征工程和其他方法来进一步提高模型的性能,但仍有改进的空间。
结论
总之,机器学习实践者必须了解独热编码的优点、局限性和最佳实践,以便成功地应用它。通过将独热编码与其他技术相结合,我们可以创建准确可靠的机器学习模型,帮助我们解决各种实际问题。