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

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


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比较算出正确率。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容