谷歌开发者关于决策树基础的视频 >>> 优酷
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的函数映射。
给定一个m,b的初始值,每次传入训练数据去修正,不断迭代。
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比较算出正确率。