无需通过编码进行分类转换即可运行的分类算法
Posted
技术标签:
【中文标题】无需通过编码进行分类转换即可运行的分类算法【英文标题】:classification algorithm that runs without categorical transformation through encoding 【发布时间】:2019-12-24 13:23:36 【问题描述】:我有一组 48 个特征列和一个二元分类目标。在处理分类问题时,我能够在使用 one-hot 编码或类似方法进行分类到数值转换后加载所有算法,例如线性、逻辑、knn、随机森林和提升分类器。但是,在运行随机森林和决策树等算法时,如果没有从分类到数值的任何转换,我将面临错误,因为 " ValueError: 无法将字符串转换为浮点数 ..."
我正在尝试一个没有任何更改的基本模型,请指导。
print(type(X)) ---> <class 'pandas.core.frame.DataFrame'>
print(type(y)) ---- > <class 'pandas.core.series.Series'>
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
X_train_rf, X_test_rf, y_train_rf, y_test_rf = train_test_split(X,y,random_state=0)
randomforest = RandomForestClassifier()
randomforest.fit(X_train_rf, y_train_rf)
y_train_pred_rf=randomforest.predict(X_train_rf)
y_pred_rf= randomforest.predict(X_test_rf)
print('training accuracy',accuracy_score(y_train_rf,y_train_pred_rf))
print('test accuracy',accuracy_score(y_test_rf,y_pred_rf))
# The o/p obtained is :
ValueError: could not convert string to float: 'Delhi' (# Delhi- the element in an feature column )
【问题讨论】:
Passing categorical data to Sklearn Decision Tree的可能重复 看看这个:***.com/questions/38108832/… yupe,通过阅读以上内容,除了一种热编码之外,还有其他方法可以将分类变量解析为随机森林或决策树算法吗?所以,一种热编码是必须的?? scikit-learn.org/stable/modules/generated/… 【参考方案1】:您可以使用 python-weka 包装器,然后您将不需要 one-hot 编码。 示例:
import weka.core.jvm as jvm
from weka.core.converters import Loader
from weka.classifiers import Classifier
def get_weka_prob(inst):
dist = c.distribution_for_instance(inst)
p = dist[next((i for i, x in enumerate(inst.class_attribute.values) if x == 'DONE'), -1)]
return p
jvm.start()
loader = Loader(classname="weka.core.converters.CSVLoader")
data = loader.load_file(r'.\recs_csv\df.csv')
data.class_is_last()
datatst = loader.load_file(r'.\recs_csv\dftst.csv')
datatst.class_is_last()
c = Classifier("weka.classifiers.trees.J48", options=["-C", "0.1"])
c.build_classifier(data)
print(c)
probstst = [get_weka_prob(inst) for inst in datatst]
jvm.stop()
【讨论】:
感谢您的回复,我们会检查一下,我们可以将此应用于数据框中的所有列,然后再将其应用于任何 sklearn 算法 Weka 模型是使用 java 桥接 Python 的不同模型 - 方法是可以使用此桥接器调用的 java 方法。要在 sklearn 中使用数据框 - 您必须使用 one-hot 编码对其进行操作。请注意,weka 中的名义属性中不能有任何特殊字符。因此,在将其保存到 csv 之前,请在任何名义属性中使用 df = df.replace([',', '"', "'", "%", ";"], '', regex=True)。以上是关于无需通过编码进行分类转换即可运行的分类算法的主要内容,如果未能解决你的问题,请参考以下文章