Python3入门机器学习

2.2 scikit-learn中的机器学习算法的封装

可以说kNN算法是一个不需要训练过程的算法。换句话说,输入样例可以直接送给训练数据集,在这个数据集上直接找到离输入样例最近的k个点,然后投票选出来得票数最高的标签就是结果了。

k近邻算法是非常特殊的,可以被认为是没有模型的算法。但是为了和其它算法统一,可以认为训练数据集就是模型本身。这样每一个算法都会有fit(拟合)这个过程。如下图所示:

python sklearn的结果train score和test score python sklearn fit_数据集


1.我们可以使用scikit-learn封装好的机器学习的算法进行预测,过程如下:

先准备好我们需要的数据,如下:

import numpy as np
import matplotlib.pyplot as plt
raw_data_X=[[3.393533211,2.331273381],
            [3.110073483,1.781539638],
            [1.343808831,3.368360954],
            [3.582294042,4.679179110],
            [2.280362439,2.866990263],
            [7.423436942,4.696522875],
            [5.745051997,3.533989803],
            [9.172168622,2.511101045],
            [7.792783481,3.424088941],
            [7.939820817,0.791637231]  #样本的特征
           ]
raw_data_y=[0,0,0,0,0,1,1,1,1,1]       #每一个样本所属的类别,用0和1来表示。

X_train=np.array(raw_data_X)
y_train=np.array(raw_data_y)  #训练数据集

x=np.array([8.093607318,3.365731514]) #假如来了一个新的x,预测它属于哪一部分。

(1).首先要加载相应的机器学习对应的算法。

from sklearn.neighbors import KNeighborsClassifier

KNeighborsClassifier这个类包装了kNN算法,这里要注意,在scikit-learn中的所有机器学习算法都是以面向对象形式进行包装的。

(2).然后创建这个算法所对应的实例。

kNN_classifier = KNeighborsClassifier(n_neighbors=6)

如果这个算法在构造的过程中需要一些参数,我们要传入这些参数,n_neighbors的值就是代表k的值。

(3).然后我们需要进行一次fit(拟合)我们的训练数据集。

kNN_classifier.fit(X_train,y_train)

拟合我们的训练数据集,它有一个返回值,就是机器学习对象的自身,所以不需要使用参数来接这个返回值是可以的。然后我们就有了这个模型,这个模型存在于kNN_classifier这个实例中。

(4).接下来就是预测的过程。

X_predict = x.reshape(1,-1)

首先要整理我们的被预测的数据,将它整理成矩阵的形式。然后用模型进行预测,只需调用predict这个函数:

kNN_classifier.predict(X_predict)

得到array([1])向量,这个向量中只有一个元素,因为我们传进去的要预测的样本只有一个。

y_predict = kNN_classifier.predict(X_predict)

用y_predict变量来保存这个结果。

y_predict[0]

y_predict的第0个元素就是我们传进去的第0个样本的特征预测的结果,得到结果1。

总结:以上就一个非常标准的使用scikit-learn封装好的机器学习的算法进行预测的一个过程:

  • 首先要加载scikit-learn中相应的机器学习对应的算法;
  • 然后创建这个算法所对应的实例,如果这个算法在构造的过程中需要一些参数,我们要传入这些参数;
  • 然后我们需要进行一次fit(拟合)我们的训练数据集;
  • 最后我们就可以进行predict(预测)的过程了。

2.根据scikit-learn中kNN算法的使用过程,我们尝试着自己封装一下kNN算法:

import numpy as np
from math import sqrt
from collections import Counter

class kNNClassifier:
    def __init__(self,k):    #构造函数
        """初始化kNN分类器"""
        assert k >= 1, "k must be valid"
        self.k = k
        self._X_train = None
        self._y_train = None
        #以上为构造函数

    def fit(self, X_train, y_train):
        """根据训练数据集X_train和y_train训练kNN分类器"""
        assert X_train.shape[0] == y_train.shape[0], \
            "the size of X_train must be equal to the size of y_train"
        assert self.k <= X_train.shape[0], \
            "the size of X_train must be at least k."

        self._X_train = X_train
        self._y_train = y_train
        return self   #fit函数都要返回自身

    def predict(self,X_predict):
        """给定待预测的数据集X_predict,返回表示X_predict的结果向量"""
        assert self._X_train is not None and self._y_train is not None, \
            "must fit before predict!"
        assert X_predict.shape[1] == self._X_train.shape[1], \
            "the feature number of X_predict must be equal to X_train"
        y_predict = [self._predict(x) for x in X_predict]
        return np.array(y_predict)

    def _predict(self,x):
        """给定单个待预测的数据集x,返回表示x_predict的预测结果值"""
        assert x.shape[0] == self._X_train.shape[1], \
            "the feature number of x must be equal to X_train"

        distances = [sqrt(np.sum((x_train - x) ** 2)) for x_train in self._X_train]
        nearest = np.argsort(distances)

        topK_y = [self._y_train[i] for i in nearest[:self.k]]
        votes = Counter(topK_y)

        return votes.most_common(1)[0][0]

    def __repr__(self):
        return "kNN(k=%d)" % self.k