我有一些包含
的表格设备数据time column, some tabular features, target classes
所有设备中的数据和目标类别大约有500行(不相同)。
我有大约1000个设备的相同数据, 我想为用于检测类的所有设备训练一个通用模型。
有人可以帮助我训练目标变量的方法吗?在这种情况下什么样的模型可以工作
答案 0 :(得分:1)
如果设备类型是数据的一部分,则可以训练决策树。如果设备类型功能对于分类很重要,则将其添加到树中。首先,自己创建设备类型功能-每种设备类型的二进制列,就像使用一键编码进行的操作一样。每个设备类型都会有一个二进制列-is_device_samsung,is_device_lg,is_device_iphone等。创建的列数等于设备类型的数。这些列中除一列以外的所有列都将为0,而指示当前类型的列将为1。这不能保证设备类型将成为模型的一部分-但让AI为您确定。 顺便说一句-除非您知道如何完全按照测试数据中的需要重用它,否则不要使用get_dummies。
另一种选择是使用python-weka包装器,该包装器接受名义属性:
示例:
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()
Weka模型是使用Java桥接到python的不同模型-这些方法是可以使用此桥接器调用的java方法。要在sklearn中使用数据框-您必须使用一键编码来对其进行操作。请注意,weka中的名义属性不能包含任何特殊字符。所以使用
df = df.replace([',', '"', "'", "%", ";"], '', regex=True)
用于任何名义属性,然后再将其保存到csv。 如果要确保将model_type功能包括在模型中,则可以对其进行欺骗并添加一个虚拟模型类型-并确保此虚拟模型的类列始终为“ 1”或“ True”-取决于您的类变量。如果此虚拟模型有足够的行,则j48将其作为第一个分支打开。一旦j48选择了该属性,该属性就会分支到所有模型类型,而不仅仅是虚拟模型。