首页 > 解决方案 > Python 中的 Classifier.predict

问题描述

我在 Python 中有这段代码:

def plot_decision_regions(X, y, classifier, resolution = 0.02):


    markers = ('s', 'x', 'o', '^','v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])


    x1_min, x1_max = X[:, 0].min() -1, X[:,0].max() + 1
    x2_min, x2_max = X[:, 1].min() -1, X[:,1].max() + 1
   xx1, xx2= np.meshgrid (np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha= 0.3, cmap = cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())


for idx, cl in enumerate (np.unique(y)):
    plt.scatter (x=X[y == cl, 0], y= X[y == cl, 1], alpha=0.8, c=colors[idx], marker= markers [idx], label = cl, edgecolor = 'black')

其中X是一个 100x2 向量,具有正常数据(两种花的萼片和花瓣长度),y是一个 100x1 向量,只有 -1 和 1 个值(类标签向量)和Classifier = Perceptron。我不知道为什么我需要计算转置

Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)

做什么

classifier.predict 

x=X[y == cl, 0], y= X[y == cl, 1]

plt.scatter (x=X[y == cl, 0], y= X[y == cl, 1], alpha=0.8, c=colors[idx], marker= markers [idx], label = cl, edgecolor = 'black')

做?

我之前加载了一个数据框,定义了我的预测方法,定义Xy

def predict(self,X):
    '''Return class label after unit step'''
    return np.where(self.net_input(X) >= 0.0, 1, -1)

myclass = Perceptron包含w_迭代时调整的(权重)。对不起,如果我的英语不完美

y = df.iloc[0:100 , 4] .values
y= np.where (y == 'Iris-setosa', -1, 1)

X= df.iloc[0:100, [0,2]].values

标签: pythonmatplotlib

解决方案


让我们先分解一下:

np.array([xx1.ravel(), xx2.ravel()])

.ravel()展平xx1xx2数组。xx1并且xx2只是以网格模式排列的坐标(分别用于 feature1 和 feature2)。想法是xx1和是特征集范围内每个间隔的xx2坐标。resolution有了足够多的这些坐标,您就可以有效地知道哪些区域被您的分类器分类为什么标签。

np.array([xx1.ravel(), xx2.ravel()]).T

您需要转置的原因是该.predict()方法需要一个 size 数组作为输入[n_samples, n_features]。散列数组的结果将是 size [n_features, n_samples],这就是我们需要转置的原因。

classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T

这将对每个网格点进行预测(然后用于在图上制作掩码以显示哪些区域被分类器分类为什么标签)。

plt.scatter (x=X[y == cl, 0], y= X[y == cl, 1], alpha=0.8, c=colors[idx], marker= markers [idx], label = cl, edgecolor = 'black')

在这里,我们绘制我们的样本。我们想分别绘制每一类样本(为了让它们具有不同的颜色),所以x=X[y == cl, 0]y= X[y == cl, 1]在标签等于我们正在检查的当前样本的点处绘制点(即cl)。cl将只是所有唯一可能标签的迭代。

一旦你看到结果是什么样子就更容易理解了(这里有一个使用make_blobs数据集和MLPClassifier:

import numpy as np
import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap
from sklearn.datasets import make_blobs
from sklearn.neural_network import MLPClassifier

def plot_decision_regions(X, y, classifier, resolution = 0.02):
    markers = ('s', 'x', 'o', '^','v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    x1_min, x1_max = X[:, 0].min() -1, X[:,0].max() + 1
    x2_min, x2_max = X[:, 1].min() -1, X[:,1].max() + 1
    xx1, xx2= np.meshgrid (np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha= 0.3, cmap = cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

colors = ['red', 'blue', 'green']
X, y = make_blobs(n_features=2, centers=3)

for idx, cl in enumerate (np.unique(y)):
    plt.scatter (x=X[y == cl, 0], y= X[y == cl, 1], alpha=0.8, c=colors[idx], label = cl, edgecolor = 'black')

classifier = MLPClassifier()
classifier.fit(X, y)

plot_decision_regions(X, y, classifier, resolution = 0.02)

你得到: 在此处输入图像描述


推荐阅读