# 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`