分类变量是表示类别或标记的。与数值型变量不同,分类变量的值是不能被排序的,故而又称为无序变量。
one-hot编码
独热编码(one-hot encoding)通常用于处理类别间不具有大小关系的特征。独热编码使用一组比特位表示不同的类别,每个比特位表示一个特征。因此,一个可能有k个类别的分类变脸就可以编码成为一个长度为k的特征向量。若变量不能同时属于多个类别,那这组值就只有一个比特位是‘开’的。
独热编码的优缺点:
- 独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
- 当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。使用稀疏向量节省空间配合特征选择降低维度
import pandas as pd
from sklearn import linear_model
df = pd.DataFrame({
'city':['SF','SF','SF','NYC','NYC','NYC','Seattle','Seattle','Seattle'],
'Rent':[3999, 4000, 4001, 3499, 3500, 3501, 2499, 2500, 2501]})
df['Rent'].mean()
3333.3333333333335
#将分类变量转换为one-hot编码并拟合一个线性回归模型
one_hot_df = pd.get_dummies(df, prefix=['city'])
one_hot_df
Rent | city_NYC | city_SF | city_Seattle | |
---|---|---|---|---|
0 | 3999 | 0 | 1 | 0 |
1 | 4000 | 0 | 1 | 0 |
2 | 4001 | 0 | 1 | 0 |
3 | 3499 | 1 | 0 | 0 |
4 | 3500 | 1 | 0 | 0 |
5 | 3501 | 1 | 0 | 0 |
6 | 2499 | 0 | 0 | 1 |
7 | 2500 | 0 | 0 | 1 |
8 | 2501 | 0 | 0 | 1 |
model = linear_model.LinearRegression()
model.fit(one_hot_df[['city_NYC', 'city_SF', 'city_Seattle']],
one_hot_df['Rent'])
model.coef_ #获取线性回归模型的系数
array([ 166.66666667, 666.66666667, -833.33333333])
model.intercept_ #获取线性回归模型的截距
3333.3333333333335
model.score(one_hot_df[['city_NYC', 'city_SF', 'city_Seattle']],
one_hot_df['Rent'