第二章监督学习_分类器的不确定估计
这章的内容主要讲的是模型内部用于判断数据类别的方式.
文中提到两种, 分别是决策函数[decision_function]和决策概率[predict_proba]
文中会介绍这两种方式在处理二分类和多分类数据时的原理.
虽然我也不知道为什么要单独拎出来讲这个,但还是先了解一下吧.
01 决策函数[decision_function]
二分类问题中:
决策函数[decision_function]的做法是:
- 计算每一各数据样本,样本的特征值最后会得到一个结果, 即一个样本一个结果
- 以0为分界点,分成[<0]和[>=0]两类
- [<0]部分永远是二分类种的第一类
import numpy as np
# 梯度提升决策树
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
# 创建二分类数据, 每类数据都是一个闭合环形. 想象一下射击用的靶
# noise:
# 用于控制环形数据的精细度, (理解成像素点比较好说明),数据越小,点约密,环形月平滑
# factor:
# 控制两个环形数据间的距离, 数据越大两个环越接近
X, y = make_circles(noise=0.25, factor=0.5, random_state=1)
y_name = np.array(["blue", "red"])[y]
# In [45]: y
# Out[45]:
# array([1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1,
# 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0,
# 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1,
# 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
# 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0], dtype=int64)
# In[46]: y_name
# Out[46]:
# array(['red', 'red', 'blue', 'red', 'red', 'blue', 'blue', 'red', 'red',
# 'red', 'red', 'blue', 'red', 'red', 'red', 'blue', 'blue', 'blue',
# 'red', 'blue', 'blue', 'red', 'red', 'red', 'blue', 'blue', 'red',
# 'blue', 'blue', 'blue', 'red', 'red', 'red', 'red', 'red', 'blue'
X_train, X_test, y_train_named, y_test_named, y_train, y_test = \
train_test_split(X, y_name, y, random_state=0)
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train_named)
# 决策函数为每一个数据样本都计算出一个值,计算结果完全取决于数据样本,因此没有什么范围限制
# print(gbrt.decision_function(X_test))
# [ 4.13592603 -1.70169917 -3.95106099 -3.62609552 4.28986642 3.66166081
# -7.69097179 4.11001686 1.10753937 3.40782222 -6.46255955 4.28986642
# 3.90156346 -1.20031247 3.66166081 -4.17231157 -1.23010079 -3.91576223
# 4.03602783 4.11001686 4.11001686 0.65709014 2.69826265 -2.65673274
# -1.86776596]
#
# print(X_test.shape)
# (25, 2)
# print(gbrt.decision_function(X_test).shape)
# (25,)
# 模拟模型判断分类的过程
greater_zero = (gbrt.decision_function(X_test) > 0).astype(int)
# print (greater_zero)
# [1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0]
pred = gbrt.classes_[greater_zero