0

我有一系列具有各種屬性的服裝/配件產品(用Python對象表示)。這些產品是通過查詢外部API和刮取商家網站以獲得各種屬性的組合而產生的。複雜對象的Python決策樹分類

我的目標是開發一個使用這些屬性對產品進行正確分類的分類器(即分類爲褲子,T恤,連衣裙等)。

我有一個訓練和一個測試數據集,它們是整個數據集的一個子集,隨機選擇的數據集已被人工分類。

我和一位專門從事機器學習的大學前同事交談過,他建議使用決策樹。但是,Python中的決策樹庫看起來非常注重數值(而不是專注於基於文本屬性對數據進行分類)。

我知道像Scikit Learn這樣的庫,但從我的簡要分析看來,它們通常涉及比我所需的規則更簡單的邏輯。

任何關於方法,庫,代碼結構等的建議將不勝感激。然而,這個問題的主要焦點是,其中Python機器學習庫(如果有的話)將最適合於此任務

產品屬性包括以下內容:

  • 名稱(str
  • 描述(str
  • available_sizes([str, str...]
  • available_colours([STR,STR ...])
  • 價格(float
  • url(str
  • CATEGORY_NAME(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']} 
+0

不確定我完全理解您的目標,但OpenCV有一些機器學習分類器:請參見http://www.cs.haifa.ac.il/~dkeren/ip/OReilly-LearningOpenCV.pdf中的第13部分。 ,請參閱第486頁關於二元決策樹的章節;有毒的蘑菇例如可能是一個有用的模型。這些egs使用C語言,但是代碼可以很容易地修改爲在python中運行 – Ryan 2014-11-03 10:37:27

+0

您能簡要解釋一下您想用該分類器實現的目標嗎?它是否在用戶輸入的類別和數據庫中的實際產品之間找到映射? – tttthomasssss 2014-11-03 10:53:06

+0

@tttthomasssss我的產品數據來自外部API,由其他系統的用戶手動輸入。分類的質量令人震驚,所以我需要開發一個系統,根據產品屬性將產品分配到正確的內部類別。 – Prydie 2014-11-03 11:54:44

回答

2

可以使用scikit學習,但你需要預處理的數據。決策樹的其他實現可以直接處理分類數據,但這並不能解決您的問題。您仍然需要預處理數據。

首先,我會忽略圖像,因爲使用它們有點複雜。 對於所有其他變量,您需要以對機器學習有意義的方式對它們進行編碼。例如,可用大小可以編碼爲0或1,具體取決於給定大小是否可用。 如果顏色來自一組固定的字符串,則顏色可以編碼爲一個分類。如果這是一個自由文本字段,則使用分類可能不太好(例如,人們可能使用灰色和灰色,這將是兩個完全無關的值,或者有錯別字等)。

說明和名稱分別是可能對每個產品都是獨一無二的,所以使用分類變量是沒有意義的,因爲每個產品只會被看到一次。對於這些,最好用一包字的方法對它們進行編碼。

你可以在tutorials section of the scikit-learn documentation找到關於文本分類的教程。你可能也想看看其他教程。

最後,我會建議從線性分類器開始,比如樸素貝葉斯或LinearSVC。如果您想要提取實際的規則,並且很少用於文本處理afaik(通常有數十或數十萬個特徵/詞,因此提取有意義的規則很困難),那麼單棵樹就非常有用。如果你想使用基於樹的方法,那麼使用像隨機森林或梯度提升這樣的集合很可能會產生更好的結果。

+0

非常感謝您的建議。我拿起了一本學習scikit-learn的電子書版本:Python中的機器學習,它詳細介紹了關於特徵提取的內容,我將嘗試一個我認爲的樸素貝葉斯分類器。 – Prydie 2014-11-03 16:38:06

+1

不確定這是最好的資源。還有一個是我的作者,我相信一個交易更多:http://www.amazon.com/Building-Learning-Community-Experience-Distilled/dp/1782161406 我開始校對你的包裝,但因爲事實錯誤太多而放棄了。網站教程應該是相當不錯的資源。 – 2014-11-03 16:41:26

+0

這很有趣,我會在完成此操作後查看您的建議。學習scikit-learn的關鍵之處在於將我之前在ML中的經驗與OpenCV結合起來,這涉及到很多複雜的特徵提取和從文本數據中提取特徵的想法。 – Prydie 2014-11-03 16:52:03