# Python機器學習、深度學習 #1 * 最近要開始碰機器學習這塊,基本上我是完全新手,加上剛好手邊有台新電腦,就從環境架設開始一步步撰寫了。 ## 環境架設 * OS:Windows 10 * 首先我們語言使用Python應該是沒什麼問題,畢竟現在python的函式庫是最強大的,而且語言本身也是相當好上手。 * 但在直接安裝python之前,我要先裝**Anaconda**;它是一個將python和其他函式庫整合起來的平台,可以把你需要的東西一次下載。當然你也可以用pip慢慢裝,是沒有問題的。 * [Anaconda官網](https://www.anaconda.com/) * 記得裝**python3**(python2已經快停止更新和支援了) * ![](https://i.imgur.com/PA5zvxi.png) * 安裝的細節就自行摸索,需要安裝什麼IDE可以自己決定,這邊應該會使用**jupyter**或**spyder**(我還在考慮) * 裝好之後就先用個Hello World測試看看有沒有問題: * ![](https://i.imgur.com/0TXRRFp.png) * 如果可以成功跑出來基本上python就裝完了,接著要裝函式庫的部分。 * 函式庫目前用到的不多,你只需要打開**Anaconda**,點選**Environments**,將上方選單選至**All**,然後再搜尋**scikit-learn**,將它安裝即可。 * ![](https://i.imgur.com/zqqIwDs.png) ## 機器學習、深度學習 ### 大致概念 * 機器學習和深度學習大家應該都有個概念,今天你把資料丟進去訓練模型,訓練完了之後再把你實際上的問題丟進去,它就會跟你講結果。 * 而實際上的運作原理是讓電腦藉由前面的資料,找出一個數學上的式子。 * 你可以想成是$f(x)=ax+b$ * $f(x)$是結果,$x$是輸入資料,今天我們就是給電腦大量的數據,讓他自己找到合適的參數$a$和$b$,讓大多數的輸入都可以對應到正確的輸出。 * 其中運用到的數學是工程數學中的最佳化(optimization),如gradient descent等方法,有興趣更了解原理的可以自行再找這些關鍵字。 ### 兩者的差別 * 深度學習其實是機器學習的一種,也就是說它們是一個母子集合的概念。 * 當輸入資料的維度相當大,你的模型很複雜時,我們就將該學習稱為深度學習。 * 機器學習多用於處理一般數值化的資料,而深度學習用於圖像處理較多。 * 一張圖片中每個像素點都是一筆資料,因此資料的維度相當驚人。 ## Decision Tree * 我們最開始碰到的第一種模型叫做決策樹(Decision Tree)。 * ![](https://i.imgur.com/qOsS9Pp.png) * 上圖是一個Decision Tree的例子,今天我們要決定一個事物的種類、結果時,我們常常使用這種結構。 * 以上圖來說,今天我們決定要不要打網球時,我們可能會先看看天氣,如果晴天就看濕度來決定、雨天就看風來決定、剛剛好就去打球;而濕度太高就不打,太低就打;風太強就不打,微風就打。 * 我們再來看看他的數學表示式: * ![](https://i.imgur.com/SUBA02t.png) * 其中上面的四種顏色包含Decision Tree的四種意義: * 橘色:每次分支要分多少樹枝? * 紅色:分支的條件為何? * 綠色:何時停止分支?(何時完成樹?) * 藍色:樹葉的意義為何? * 而我們也可以分析出該演算法的四步驟: 1. 學習分支條件 2. 將資料$D$切成$C$塊的$D_c$ 3. 將子樹$G_c$設為新的樹結構 4. 遞迴新的樹 ### sklearn.tree * sklearn這個函式庫裡面幫我們完成了Decision tree的實作,將它引入後只要導入資料即可快速完成樹。 * 範例code,寫得較雜亂且沒有太多註解,不懂的人可能煩請去官網查詢。 ```python=1 from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, export_graphviz from sklearn import tree iris = load_iris() X = iris['data'] y = iris['target'] features = iris.feature_names print("---Dataset Data--- \n") print("Data Shape : ",X.shape) for index,f in enumerate(X[:3]): print(index + 1,"-> ",f) print("\n---Dataset Content---\n") for index,f in enumerate(features): print(index + 1,"). ",f) import random data_temp = list(zip(X, y)) random.shuffle(data_temp) X,y = zip(*data_temp) train_data = X[0:140] # from 0 to 140 for training train_labels = y[0:140] test_data = X[141:] # from 141 to final for testing test_labels = y[141:] clf = tree.DecisionTreeClassifier() clf = clf.fit(train_data,train_labels) print("Test Accuracy : ",clf.score(test_data,test_labels)) ``` * output ``` ---Dataset Data--- Data Shape : (150, 4) 1 -> [5.1 3.5 1.4 0.2] 2 -> [4.9 3. 1.4 0.2] 3 -> [4.7 3.2 1.3 0.2] ---Dataset Content--- 1 ). sepal length (cm) 2 ). sepal width (cm) 3 ). petal length (cm) 4 ). petal width (cm) Test Accuracy : 1.0 ``` * 初始化的相關資料: ```python DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False) ``` | 參數 | 說明 | -------- | -------- | criterion| 決定資料一致性的計算方式(分支停止的因素)。分為gini和entropy兩種,預設為gini。 |splitter|決定資料的分割方式。分為best和random兩種,預設為best。 |max_depth|樹的最大深度限制。深度越大可以分得越好,但是效率越差。可以填入整數或None,若None為無限制。預設為None。 |min_samples_split|每次分支時最少需要的資料樣本數。如果填入整數`n`就是需要`n`個;如果填入浮點數則最少需要`ceil(min_samples_split * n_samples)`。預設為2。 |min_samples_leaf|在葉節點最少的資料樣本數。有平滑模型的效果。同上可以填入整數或浮點數(規則也一樣)。預設為1。 |min_weight_fraction_leaf|葉節點資料的權重值。若填入0則和一般樣本一樣。預設為0。 |max_features|進行最佳切割時會考慮的特徵數量。可填入整數、浮點數、auto、sqrt、log2、None。預設為None。 |random_state|生成樹時是否採用亂數。如果填入整數,則將它視為種子碼,輸入None則不使用亂數。預設為None。 |max_leaf_nodes|葉節點的最大數量。填入整數後將產生符合需求且雜質最低的決策樹,若填入None則不受限制。預設為None。 |min_impurity_decrease|如果節點分支後讓雜質下降大於等於該值,則進行分支。預設為0。 |min_impurity_split|如果節點的雜質高於該值才會分支,否則該節點為葉節點。可以提早停止樹的生長,不建議使用。預設為1e-7。 |class_weight|可設定資料的權重值,如果沒有給就都是1。預設為None。 |presort|是否要將資料預先排序。在資料過大時會導致速度下降,但在處理小資料時可能讓效率提升。預設為False。 * 更多code資料請自行google其他網頁或是去sklearn的官方網頁學習,因大多是API的部分,就不多闡述了。 ## Info - Email: zero871015@gmail.com - Web: [Zerone](https://zero871015.github.io) - [time=Sat, Sep 28, 2019 11:51 AM] [name=Zero871015] ###### tags: `ML/DL` `note` `python`