Python3入门机器学习
2.2 scikit-learn中的机器学习算法的封装
可以说kNN算法是一个不需要训练过程的算法。换句话说,输入样例可以直接送给训练数据集,在这个数据集上直接找到离输入样例最近的k个点,然后投票选出来得票数最高的标签就是结果了。
k近邻算法是非常特殊的,可以被认为是没有模型的算法。但是为了和其它算法统一,可以认为训练数据集就是模型本身。这样每一个算法都会有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