In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
sns.set(font='SimHei')
#plt.rcParams['axes.grid'] = False
import numpy as np
import pandas as pd
pd.options.display.max_rows = 10
from IPython.display import Image
深化拓展
In [2]:
from sklearn.datasets import load_iris
data = load_iris()
# 准备特征数据
X = pd.DataFrame(data.data,
columns=["sepal_length", "sepal_width", "petal_length", "petal_width"])
# 准备标签数据
y = pd.DataFrame(data.target, columns=['target'])
y.replace(to_replace=range(3), value=data.target_names, inplace=True)
# 组建样本 [特征,标签]
samples = pd.concat([X, y], axis=1, keys=["x", "y"])
samples.head(5)
Out[2]:
In [3]:
samples["y", "target"].value_counts()
Out[3]:
In [4]:
samples["x"].describe()
Out[4]:
In [5]:
Image(url="https://upload.wikimedia.org/wikipedia/commons/f/f3/CART_tree_titanic_survivors.png")
Out[5]:
In [6]:
Image(url="http://scikit-learn.org/stable/_images/iris.svg")
Out[6]:
In [7]:
Image(url="http://scikit-learn.org/stable/_images/sphx_glr_plot_iris_0011.png")
Out[7]:
In [8]:
samples = pd.concat([X, y], axis=1)
samples.head(3)
Out[8]:
In [9]:
Image(url="https://upload.wikimedia.org/wikipedia/commons/f/f3/CART_tree_titanic_survivors.png")
Out[9]:
In [10]:
def splitter(samples, feature, threshold):
# 按特征 f 和阈值 t 分割样本
left_nodes = samples.query("{f} < {t}".format(f=feature, t=threshold))
right_nodes = samples.query("{f} >= {t}".format(f=feature, t=threshold))
return {"left_nodes": left_nodes, "right_nodes": right_nodes}
In [11]:
split = splitter(samples, "sepal_length", 5)
# 左子集
x_l = split["left_nodes"].loc[:, "target"].value_counts()
x_l
Out[11]:
In [12]:
# 右子集
x_r = split["right_nodes"].loc[:, "target"].value_counts()
x_r
Out[12]:
In [13]:
def calc_class_proportion(node):
# 计算各标签在集合中的占比
y = node["target"]
return y.value_counts() / y.count()
In [14]:
calc_class_proportion(split["left_nodes"])
Out[14]:
In [15]:
calc_class_proportion(split["right_nodes"])
Out[15]:
主要的评价函数有三种,它们评价的是集合的不纯度(值越大,集合越混杂)。
先做些数学定义以便于描述:
假设对于集合 $m$ 有 $N_m$ 个样本,可分割成 $R_m$ 子集。
若总的标签类别有 $K$ 种,则标签 $k$ 在此集合中的占比为:
且令标签 $k$ 是占比最大的标签,即 $k(m) = \operatorname{arg max}_k \hat{p}_{m k}$.
我们一般把集合的分类结果定义为占比最大的标签,那么落在此集合中的其它标签就是误分类。其比率是 $1 - \hat{p}_{m k}(m)$.
评价:过拟合
如何模型解释
参数的含义
In [ ]: