機器學習分類問題之決策樹筆記

谷歌開發(fā)者關于決策樹基礎的視頻 >>> 優(yōu)酷


1.分辨橙子和蘋果

from sklearn import tree
from sklearn.datasets import load_iris
import numpy as np
from sklearn.externals.six import StringIO
import pydot
import matplotlib.pyplot as plt

# 決策樹
features = [[140, 1], [130, 1], [150, 0], [170, 0]]  # 1帶表平滑的传透,0表示坑洼的
labels = [0, 0, 1, 1]  # 0 蘋果 1 橘子
clf = tree.DecisionTreeClassifier()  # 決策樹分類器
clf = clf.fit(features, labels)
print(clf.predict([[150, 0]])) 

2.鶯尾花

這是一個非常經(jīng)典的案例次慢,之前也有一次作業(yè)時做這個,只不過不是用決策樹

# 1.引入并打印數(shù)據(jù)集
iris = load_iris()
print(iris.feature_names)  # 特征值
print(iris.target_names)  # 種類
print(iris.data[0])
for i in range(len(iris.target)):
    print(i, iris.target[i], iris.data[i])

# 2.訓練分類器,將數(shù)據(jù)切分為訓練數(shù)據(jù)和測試數(shù)據(jù)
test_idx = [0, 50, 100]

# 訓練集
train_target = np.delete(iris.target, test_idx)  # 移除3行數(shù)據(jù),即每種花刪掉一個
train_data = np.delete(iris.data, test_idx, axis=0)

# 測試集
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

# 創(chuàng)建決策樹并訓練
clf = tree.DecisionTreeClassifier()
clf = clf.fit(train_data, train_target)
print(clf.predict(test_data))  # 判斷

在本例中使用決策樹進行分類的基本流程就是

1.引入訓練數(shù)據(jù)和測試數(shù)據(jù)
2.調用分類器  tree.DecisionTreeClassifier()
3.利用分類器進行分類盏袄,.fit(訓練數(shù)據(jù)间雀,目標種類)
4.測試 .predict(test_data)
5.查看整體正確率
  from sklearn.metrics import accuracy_score
  print(accuracy_score(test_data, predictions))

3.關于特征值的選擇

特征值features直接影響分類器結果正確率极舔,例如估算到達某地所用時間群发,用“公里”來估計遠比用經(jīng)緯度差距估計來得好晰韵,多個特征值可以精確結果。

4.更加完善的鶯尾花示例

# 不同的決策樹測試
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree

iris = datasets.load_iris()

X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5)
my_classifier = tree.DecisionTreeClassifier()

# 如果不用決策樹可以用KNeighborsClassifier ,正確率 0.96
# from sklearn.neighbors import KNeighborsClassifier
# my_classifier = KNeighborsClassifier()

my_classifier.fit(X_train, y_train)
predictions = my_classifier.predict(X_test)

# 測試正確率
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, predictions))

之所以將數(shù)據(jù)集定義為X,y是因為對于分類器來說熟妓,輸入與輸出數(shù)據(jù)就像一個從x到y(tǒng)的函數(shù)映射雪猪。


y=mx+b

給定一個m,b的初始值起愈,每次傳入訓練數(shù)據(jù)去修正只恨,不斷迭代译仗。

圖片來自 A Neural Network Playground

5.重寫分類器,使用簡單的KNN算法

利用KNN算法來根據(jù)距離確定類別坤次,以鶯尾花數(shù)據(jù)集為例古劲,因為有4個特征斥赋,所以可抽象為一個四位空間缰猴,每條數(shù)據(jù)為一個點,通過計算每次測試數(shù)據(jù)與每個訓練數(shù)據(jù)點的距離(Enclidean Distance)來確定自身類別疤剑,然后形成測試數(shù)據(jù)的結果集滑绒,最后與訓練數(shù)據(jù)結果集比較得出正確率。

# 手寫分類器
from scipy.spatial import distance


def euc(a, b):
    return distance.euclidean(a, b)


class ScrappyKNN():
    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        predictions = []
        for row in X_test:
            label = self.closest(row)
            predictions.append(label)
        return predictions

    def closest(self, row):
        best_dist = euc(row, self.X_train[0])
        best_index = 0
        for i in range(1, len(self.X_train)):
            dist = euc(row, self.X_train[i])
            if dist < best_dist:
                best_dist = dist
                best_index = i
        return self.y_train[best_index]


from sklearn import datasets

iris = datasets.load_iris()

X = iris.data
y = iris.target

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5)

my_classifier = ScrappyKNN()

my_classifier.fit(X_train, y_train)
predictions = my_classifier.predict(X_test)

# 測試正確率
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, predictions))

整體流程:

1.導入數(shù)據(jù)隘膘,X代表特征數(shù)據(jù)集疑故,y代表類別數(shù)據(jù)集,
2.分切數(shù)據(jù)弯菊,對半平分為訓練數(shù)據(jù)和測試數(shù)據(jù)
3.利用my_classifier.fit(X_train, y_train)傳入數(shù)據(jù)纵势,my_classifier.predict(X_test)計算每個測試數(shù)據(jù)與訓練數(shù)據(jù)點的距離,并把最短距離對應索引的y_train值(類別)回傳給predictions然后添加進結果集管钳。有點類似vec2word钦铁。
4.把測試得到的結果集predictions與y_test比較算出正確率。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末才漆,一起剝皮案震驚了整個濱河市牛曹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醇滥,老刑警劉巖黎比,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸳玩,居然都是意外死亡阅虫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門不跟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颓帝,“玉大人,你說我怎么就攤上這事躬拢《懵模” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵聊闯,是天一觀的道長工猜。 經(jīng)常有香客問我,道長菱蔬,這世上最難降的妖魔是什么篷帅? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任史侣,我火速辦了婚禮,結果婚禮上魏身,老公的妹妹穿的比我還像新娘惊橱。我一直安慰自己,他們只是感情好箭昵,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布税朴。 她就那樣靜靜地躺著,像睡著了一般家制。 火紅的嫁衣襯著肌膚如雪正林。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天颤殴,我揣著相機與錄音觅廓,去河邊找鬼。 笑死涵但,一個胖子當著我的面吹牛杈绸,可吹牛的內容都是我干的。 我是一名探鬼主播矮瘟,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞳脓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芥永?” 一聲冷哼從身側響起篡殷,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埋涧,沒想到半個月后板辽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡棘催,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年劲弦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醇坝。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邑跪,死狀恐怖,靈堂內的尸體忽然破棺而出呼猪,到底是詐尸還是另有隱情画畅,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布宋距,位于F島的核電站轴踱,受9級特大地震影響,放射性物質發(fā)生泄漏谚赎。R本人自食惡果不足惜淫僻,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一诱篷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雳灵,春花似錦棕所、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笑撞,卻和暖如春岛啸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茴肥。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荡灾,地道東北人瓤狐。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像批幌,于是被迫代替她去往敵國和親础锐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容