AIU人工智能学院:数据科学、人工智能从业者的在线大学。
数据科学(Python/R/Julia)数据分析、机器学习、深度学习
scikit-learn中有两个函数可用于获取分类器的不确定度评估:decision_function和predict_proba。大多数分类器都至少有其中一个函数。下面我们来构造一个GradientBoostingClassifier分类器(同时拥有decision_function和predic_proba两个方法):
- from sklearn.ensemble import GradientBoostingClassifierfrom sklearn.datasets
- import make_circles
- x, y = make_circles(noise=0.25, factor=.5, random_state=1)
- #为了便于说明,我们将两个类别重命名为“blue"和”red“y_named = np.array(["blue", "red"])[y]#我们可以对人一个数组调用train_test_split#所有数组的划分方式都是一致的
- x_train, x_test, y_train, y_test = train_test_split(x, y_named, random_state=0)
- #构建梯度提升模型
- gbrt = GradientBoostingClassifier(random_state=0).fit(x_train, y_train)
- #对于二分类的情况,decision_function返回值的形状是(n_samples),为每个样本都返回一个浮点数
- print("x_test.shape: {}".format(x_test.shape))
- print("decision_function shape: {}".format(gbrt.decision_function(x_test).shape))
- #显示decision_function的前几个元素
- print("decision function :\n{}".format(gbrt.decision_function(x_test)[:7]))
- #查看决策函数的正负号来再现预测值
- print("thresholded decision function:\n{}".format(gbrt.decision_function(x_test) > 0))
- print("Predicitons:\n{}".format(gbrt.predict(x_test)))
- #对于二分类问题,“反”类始终是classes_属性的第一个袁术,“正”类是classes_的第二个袁术。因此,你想要完全再现#predict输出,需要利用classes_属性#将布尔值True/False转换成0和1
- greater_zero = (gbrt.decision_function(x_test) > 0).astype(int)
- #利用0和1作为classes_的索引
- pred = gbrt.classes_[greater_zero]
- #pred与gbrt.predict的输出完全相同
- print("pred is equal to predicitong: {}".format(np.all(pred == gbrt.predict(x_test))))
运行后结果如下图:

分类器的不确定性评估
decision_function可以在任意范围内取值,这块取决于数据与模型参数,下面我们利用颜色编码在二维平面中画出所有点的decision_function,还有决策边界,后者我们之前见过,对应代码如下:
- decision_function = gbrt.decision_function(x_test)
- print("decision function minimum: {:.2f} maxminum: {:.2f}".format(np.min(decision_function),np.max(decision_function)))
- fig, axes = plt.subplots(1, 2, figsize=(13, 5))mglearn.tools.plot_2d_separator(gbrt, x, ax=axes[0], alpha=.4, fill=True, cm=mglearn.cm2)
- scores_image = mglearn.tools.plot_2d_scores(gbrt, x, ax=axes[1], alpha=.4, cm=mglearn.ReBl)
- for ax in axes:#画出训练点和测试点
- mglearn.discrete_scatter(x_test[:, 0], x_test[:, 1], y_test, markers='^', ax=ax)
- mglearn.discrete_scatter(x_train[:, 0], x_train[:, 1], y_train, markers='o', ax=ax)
- ax.set_xlabel("feature 0 value")ax.set_ylabel("feature 1 value")
- cbar = plt.colorbar(scores_image, ax=axes.tolist)
- axes[0].legend(["test class 0", "test class 1", "train class 0", "train class 1"], ncol=4, loc=(.1, 1.1))
运行后结果如下图:

梯度提升模型在一个二维玩具数据集上的决策边界(左)和决策函数(右)
由上述运行结果可知,同时给出预测结果和分类器的置信度,这样给出的信息量更大。尽管如此,我们很难分辨出两者之间的边界,对此,我们将在下一节继续讨论!


雷达卡







京公网安备 11010802022788号







