机器学习 使用One hot encoding提升性能
One hot encoding对于机器学习至关重要,因为它可以使算法解释分类变量。这种方法通过将每个类别表示为二进制向量来简化处理。为了提高机器学习速度,我们的博客文章概述了One hot encoding,并提供了一个带有示例数据和代码的实际项目。
什么是One hot encoding
一种用于表示分类数据的技术,可以使机器学习算法快速分析,被称为“One hot encoding”。该方法将每个类别转换为长度与类别数相等的二进制向量。
One hot encoding如何提高机器学习性能
One hot encoding是机器学习模型中用于预处理分类变量的技术。为了使计算机学习系统能够快速处理类别信息,必须将其转换为数值变量。这很重要,因为大多数机器学习算法无法直接解释类别数据,而是需要数值输入变量。
是的,让我们看一个数据集,其中的分类变量“水果”可能的取值为“苹果”,“香蕉”或“橘子”。以下表格可以显示这个数据集:
Index | Fruits | Price |
---|---|---|
0 | apple | 1.2 |
1 | banana | 0.9 |
2 | orange | 1.1 |
3 | apple | 1.4 |
4 | banana | 1.0 |
为了对”fruit”变量进行one-hot编码,我们首先创建三个新的二进制变量”fruit_apple”、”fruit_banana”和”fruit_orange”。然后,对于初始数据集中的每一行,如果该类别存在,则将相应的二进制变量的值设置为1,否则设置为0。经过one-hot编码后的最终表格如下所示−
Fruits_apple | Fruits_banana | Fruits_orange | Price |
---|---|---|---|
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 |
如我们所见,类别变量”fruit”已被分为三个二进制变量,以便于机器学习算法更容易理解。
由于使用了独热编码,机器学习系统现在可以理解每个水果品种与价格之间的相关性,并能够产生更精确的预测。
使用随机森林算法改进机器学习性能的独热编码
我们将探讨如何在处理分类数据时使用独热编码来提高机器学习效率。我们将创建一个全新的数据集,使用独热编码来转换分类变量,并使用随机森林方法来训练一个机器学习模型。我们将使用Python和scikit-learn框架来实现我们的项目。
导入库和创建数据集
让我们首先构建一个新的数据集,包含四个变量”Size”、”Price”、”Location”和”Bedrooms”。分类变量”Location”有三个可能的取值:”A”、”B”和”C”,而分类变量”Bedrooms”有四个可能的取值:”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-squared得分约为-10.1。我们可以尝试使用其他随机森林算法的超参数、特征工程和其他方法来进一步提升模型的性能,但仍有改进的空间。
结论
总之,机器学习从业者必须意识到独热编码的好处、局限性和最佳实践,以便成功应用。通过将独热编码与其他技术结合起来,我们可以创建准确可靠的机器学习模型,帮助我们解决各种实际问题。