机器学习分类问题之决策树笔记

谷歌开发者关于决策树基础的视频 >>> 优酷


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.莺尾花

这是一个非常经典的案例,之前也有一次作业时做这个,只不过不是用决策树

# 1.引入并打印数据集
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.训练分类器,将数据切分为训练数据和测试数据
test_idx = [0, 50, 100]

# 训练集
train_target = np.delete(iris.target, test_idx)  # 移除3行数据,即每种花删掉一个
train_data = np.delete(iris.data, test_idx, axis=0)

# 测试集
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

# 创建决策树并训练
clf = tree.DecisionTreeClassifier()
clf = clf.fit(train_data, train_target)
print(clf.predict(test_data))  # 判断

在本例中使用决策树进行分类的基本流程就是

1.引入训练数据和测试数据
2.调用分类器  tree.DecisionTreeClassifier()
3.利用分类器进行分类,.fit(训练数据,目标种类)
4.测试 .predict(test_data)
5.查看整体正确率
  from sklearn.metrics import accuracy_score
  print(accuracy_score(test_data, predictions))

3.关于特征值的选择

特征值features直接影响分类器结果正确率,例如估算到达某地所用时间,用“公里”来估计远比用经纬度差距估计来得好,多个特征值可以精确结果。

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))

之所以将数据集定义为X,y是因为对于分类器来说,输入与输出数据就像一个从x到y的函数映射。


y=mx+b

给定一个m,b的初始值,每次传入训练数据去修正,不断迭代。

图片来自 A Neural Network Playground

5.重写分类器,使用简单的KNN算法

利用KNN算法来根据距离确定类别,以莺尾花数据集为例,因为有4个特征,所以可抽象为一个四位空间,每条数据为一个点,通过计算每次测试数据与每个训练数据点的距离(Enclidean Distance)来确定自身类别,然后形成测试数据的结果集,最后与训练数据结果集比较得出正确率。

# 手写分类器
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.导入数据,X代表特征数据集,y代表类别数据集,
2.分切数据,对半平分为训练数据和测试数据
3.利用my_classifier.fit(X_train, y_train)传入数据,my_classifier.predict(X_test)计算每个测试数据与训练数据点的距离,并把最短距离对应索引的y_train值(类别)回传给predictions然后添加进结果集。有点类似vec2word。
4.把测试得到的结果集predictions与y_test比较算出正确率。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容