不幸的是 scikit-learn 不能很好地处理分类特征——它们必须被编码。One-hot-encoding 很棒,可以很容易地在 sklearn 中实现。因此,如果您有一个特征列数组 X 和一个类标签向量 y
from sklearn import OneHotEncoder
ohe = OneHotEncoder(categorical_features=[0])
X = ohe.fit_transform(X).toarray()
将为您执行编码(categorical_features 属性给出您要编码的特征的索引)。更重要的是,如果您的功能有多个级别,那么单热编码可能会给您留下一个稀疏且低效的 X 数组。在这种情况下,进行计数变换可能是有益的,可能会用相应的对数优势比替换每个级别。
计数变换
上面的链接对它进行了更彻底的解释,但是,用外行的话来说,对于每个分类特征,您:
- 计算一个级别(类别)属于 class0 或 class1 的次数
- 每个计数加 0.5(当一个级别严格属于一个类时,这会处理实例)
- 计算它属于任一类的概率。
- 计算优势比的对数
- 用相应的对数优势比替换每个级别
通过这种方式,您可以获得表示特征多个级别中每个级别的数值,而无需为每个级别创建虚拟变量。尽管如此,20 个变量还是很多,您可能希望使用 PCA 进行数据压缩和降维。
一般来说,基于树的方法的一大优点是它们不需要标准化。话虽如此,从数据科学的角度来看,我会训练几种不同的模型(基于树的方法、支持向量机、逻辑回归、knn 等),然后看看哪一个产生最好的结果。除了 CART 之外的所有方法都受益于缩放,所以请尝试
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)
我希望这能回答你的大部分问题。我不确定你为什么要连接两个非常不同的变量,比如城市和网址,但是如果你对它们进行编码或进行计数转换,你的 X 数组应该没问题,你可以将它们分开。此外,您不必担心给定变量的长度 - python 是面向对象的(如果您收到抱怨“长度”的错误消息,您可能只是混淆了您的索引)。