目錄索引
寫在前面的話
如果您有任何地方看不懂的,那一定是我寫的不好,請您告訴我,我會爭取寫的更加簡單易懂!
如果您有任何地方看着不爽,請您盡情的噴,使勁的噴,不要命的噴,您的槽點就是幫助我要進步的地方!
1.決策樹構建的一般流程
- 收集數據:任何你能收集數據的方法
- 准備數據: 決策樹的算法只適用於標稱型數據(可理解為離散型的,不連續的),因此數值型的數據(連續的數據)必須離散化。
- 分析數據: 可以使用任何方法,構造樹完成之后,我們要檢查圖形是否符合預期。
- 訓練算法:構造決策樹的數據結構。
- 測試算法: 使用經驗樹計算錯誤率。
- 使用算法: 此步驟可以適用於任何監督學習算法,而使用決策數可以更好的理解數據的內在含義 (why? 對比於其他算法,比如說k均值算法,就是把給定的數據按照相似度分為一類,每一類表示什么你可能就不知道了。就像我們上一章講的那個例子,可以用決策樹做郵件的分類系統,我們可以根據分類標簽知道這個郵件是垃圾郵件還是需要立刻處理的郵件)
2. 數據的構建
我們使用的例子還是《機器學習與實戰》那本書上的例子。我把寫作的思路和流程改了一下,還有這本書里好多錯誤,我好想幫作者重寫這本書,或許不是作者的錯誤,是翻譯和排版的錯誤。
首先我們第一步還是收集數據:
在這張表中我們可以發現這里有5個數據,這里有兩個特征(要不要浮出水面生存,和是否有腳蹼)來划分這5個生物是魚類還是非魚類。
現在我們要做的就是是要根據第一個特征還是第二個特征來划分數據,進行分類。
我們使用python來構建我們的代碼。
我們創建一個名為trees.py的python文件,然后在下面輸入以下的代碼
1 #!/usr/bin/env python 2 # coding=utf-8 3 # author: chicho 4 # running: python trees.py 5 # filename : trees.py 6 7 def createDataSet(): 8 dataSet = [[1,1,'yes'], 9 [1,1,'yes'], 10 [1,0,'no'], 11 [0,1,'no'], 12 [0,1,'no']] # 我們定義了一個list來表示我們的數據集,這里的數據對應的是上表中的數據 13 14 labels = ['no surfacing','flippers'] 15 16 return dataSet, labels
其中第一列的1表示的是不需要浮出水面就可以生存的,0則表示相反。 第二列同樣是1表示有腳蹼,0表示的是沒有。
這個時候我們來測試以下我們的數據集。
我用的是linux系統,我們打開一個終端來測試以下我們的數據。
我們創建完這個文件之后,進入到這個文件的目錄下。我把這個文件保存在~/code 這個路徑下。
我們輸入python,進入shell命令,如下圖所示
代碼如下:
1 >>> import trees 2 >>> reload(trees) 3 <module 'trees' from 'trees.pyc'> 4 >>> myDat,labels=trees.createDataSet() 5 >>> myDat 6 [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']] 7 >>> labels 8 ['no surfacing', 'flippers'] 9 >>>
我們來說說這段代碼:
import的作用:
導入/引入一個python標准模塊,其中包括.py文件、帶有init.py文件的目錄。
例如:
import module_name[,module1,...] from module_name import *|child[,child1,...]
注意:
多次重復使用import語句時,不會重新加載被指定的模塊,只是把對該模塊的內存地址給引用到本地變量環境。
也就是說使用import的時候引用的module只會被加載一次,只會被加載一次,系統會把這個模塊的地址給引用它的代碼或者是這個python文件。
我們來測試以下
構建兩個文件 a.py 和 b.py
其中a.py的代碼如下:
#!/usr/bin/env python # coding=utf-8 import os print 'in a.py file' print 'The address of os is:', id(os) print '***end***'
我們在b.py中寫如下代碼:
#!/usr/bin/env python # coding=utf-8 #filename: b.py import a import os print "*****************" print 'in b file' print 'The adress of b file is:',id(os) import a print 'The adress of a module is:',id(a)
這個時候,我們來測試以下結果:
我們在a,b兩個文件中都引入了os 模塊但是我們發現它的地址都沒有改變。
reload
reload 的目的是為了開發期的 “edit and debug”/即編即調
reload 的作用:
對已經加載的模塊進行重新加載,一般用於原模塊有變化等特殊情況,reload前該模塊必須已經import過。
e.g:
import os reload(os)
reload會重新加載已加載的模塊,但原來已經使用的實例還是會使用舊的模塊,而新生產的實例會使用新的模塊;reload后還是用原來的內存地址;不能支持from。。import。。格式的模塊進行重新加載。
我們在舉一個例子:
創建兩個文件c.py, 以及文件 d.py
#!/usr/bin/env python # coding=utf-8 # filename : c.py import os print 'in c.py file' print 'The address of os is:', id(os) print '***end***'
這個時候我們用d.py這個文件去引用c這個模塊
#!/usr/bin/env python # coding=utf-8 #filename: d.py import c import os print "*****************" print 'in d file' print 'The adress of os is:',id(os) print 'The address of c file is:',id(c) print '*****reload******' reload(c) print '****reload*****' print 'The adress of c module is:',id(c)
接下來我們來測試一下結果:
可以發現reload和import的區別就是一個只能加載模塊多次,一個可以加載一次
總之,我們的數據集就這么愉快的創建好了。
3.參考鏈接
http://blog.csdn.net/turkeyzhou/article/details/8846527
寫在后面的話
我又打不動字了,本來還想寫的更好一些,有時間再來補得更好一點吧。
要么就不做,要做就做最好,這是我的忍道!
所以這篇blog也是我好好寫的,有啥需要改進的請您及時告訴我。^^
這個系列都是轉的。。。。。。。。