Python 决策树分类复杂对象
我有一堆衣服和配饰的产品,这些产品用一个Python对象来表示,并且它们有很多不同的属性。这些产品是通过查询外部API和抓取商家网站来获取各种属性生成的。
我的目标是开发一个分类器,利用这些属性来正确地将产品分类,比如分成裤子、T恤、裙子等等。
我有一份训练数据和一份测试数据,这些数据是从整个数据集中随机选出来的一部分,并且已经手动分类过。
我跟一个以前的大学同学聊过,他专门研究机器学习,他建议我使用决策树。不过,Python中的决策树库似乎更注重数字计算,而不是根据文本属性来分类数据。
我知道有像Scikit Learn这样的库,但根据我简单的分析,它们的规则逻辑似乎比我需要的要简单。
如果能给我一些关于方法、库、代码结构等方面的建议,我会非常感激。不过,这个问题的主要关注点是哪个Python机器学习库(如果有的话)最适合这个任务。
这些产品的属性包括:
- 名称 (
str
) - 描述 (
str
) - 可用尺码 (
[str, str...]
) - 可用颜色 ([str, str...])
- 价格 (
float
) - 网址 (
str
) - 类别名称 (
str
) - 图片 (
[str, str...]
- 网址)
一个产品的例子:
{ 'category': u"Men's Accessories",
'colours': [u'White'],
'description': u'Keep your formal style looking classic with this white short sleeve Oxford shirt with roll up sleeve detailing.',
'ean': u'',
'gender': u'M',
'images': [ u'http://media.topman.com/wcsstore/TopMan/images/catalog/83D21DWHT_large.jpg',
u'http://media.topman.com/wcsstore/TopMan/images/catalog/83D21DWHT_2_large.jpg',
u'http://media.topman.com/wcsstore/TopMan/images/catalog/83D21DWHT_3_large.jpg',
u'http://media.topman.com/wcsstore/TopMan/images/catalog/83D21DWHT_4_large.jpg'],
'last_scraped': datetime.datetime(2014, 11, 1, 7, 13, 28, 943000),
'merchant_id': 2479L,
'merchant_uri': u'http://www.topman.com/en/tmuk/product/white-oxford-short-sleeve-shirt-157702?geoip=noredirect',
'name': u'White Oxford Short Sleeve Shirt',
'price': 26.0,
'sizes': [u'XXS', u'XS', u'S', u'M', u'L', u'XL', u'XXL']}
1 个回答
你可以使用scikit-learn这个工具,但在使用之前,你需要先处理一下你的数据。其他一些决策树的实现可以直接处理分类数据,但这并不能解决你的所有问题,你还是需要对数据进行预处理。
首先,我建议你先不考虑图片,因为使用图片会比较复杂。对于其他变量,你需要用一种机器学习能理解的方式来编码它们。比如,产品的可用尺码可以用0和1来表示,0表示该尺码不可用,1表示可用。颜色如果是从固定的字符串集合中选择的,可以用分类的方式来编码。如果这个字段是自由文本,使用分类可能就不太合适了(比如,有人可能会用“gray”和“grey”,这两个词其实是完全不同的,或者可能会有拼写错误等)。
产品的描述和名称可能是独一无二的,所以在这方面使用分类变量就没什么意义,因为每个名称或描述只会出现一次。对于这些,最好用一种叫做“词袋”的方法来编码。
你可以在scikit-learn文档的教程部分找到关于文本分类的教程。你也可以看看其他的教程。
最后,我建议你先从线性分类器入手,比如朴素贝叶斯或线性支持向量机(LinearSVC)。单棵决策树主要用于提取实际规则,而在文本处理上很少使用(因为通常会有成千上万的特征/单词,所以提取有意义的规则很困难)。如果你想使用基于树的方法,使用像随机森林或梯度提升这样的集成方法,通常会得到更好的结果。