书中例子如下:
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
X_new = np.array([[6.3, 2.5, 5., 1.9]])
prediction = knn.predict(X_new)
print(prediction)
print(iris_dataset['target_names'][prediction])
书中使用了邻近算法, 邻近算法概念.
01_001 建模代码分析_包# 机器学习库中k邻近算法中的包
# 机器学习库中为每一只算法都单独写了一个包
from sklearn.neighbors import KNeighborsClassifier
# 之前说个这个就是创建多维数组用的
import numpy as np
我一般看函数都用dir(xxx)来查看列表,但是sklearn需要查看[all]才行
In [1]: import sklearn
In [2]: dir(sklearn)
Out[2]:
['__SKLEARN_SETUP__',
'__all__',
'__builtins__',
'__cached__',
'__check_build',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'__version__',
'_config',
'_distributor_init',
'base',
'clone',
'config_context',
'exceptions',
'externals',
'get_config',
'logger',
'logging',
'os',
'random',
'set_config',
'setup_module',
'show_versions',
'sys',
'utils']
In [4]: sklearn.__all__
Out[4]:
['calibration',
'cluster',
'covariance',
'cross_decomposition',
'datasets',
'decomposition',
'dummy',
'ensemble',
'exceptions',
'experimental',
'externals',
'feature_extraction',
'feature_selection',
'gaussian_process',
'inspection',
'isotonic',
'kernel_approximation',
'kernel_ridge',
'linear_model',
'manifold',
'metrics',
'mixture',
'model_selection',
'multiclass',
'multioutput',
'naive_bayes',
'neighbors',
'neural_network',
'pipeline',
'preprocessing',
'random_projection',
'semi_supervised',
'svm',
'tree',
'discriminant_analysis',
'impute',
'compose',
'clone',
'get_config',
'set_config',
'config_context',
'show_versions']
需要的算法都在这个列表里,想学哪个算法用 help(sklearn.neighbors)查看就行
In [7]: import sklearn.neighbors
In [8]: help(sklearn.neighbors)
Help on package sklearn.neighbors in sklearn:
NAME
sklearn.neighbors
DESCRIPTION
The :mod:`sklearn.neighbors` module implements the k-nearest neighbors
algorithm.
PACKAGE CONTENTS
_ball_tree
_base
_classification
_distance_metric
_graph
_kd_tree
_kde
_lof
_nca
_nearest_centroid
_partition_nodes
_quad_tree
_regression
_unsupervised
setup
tests (package)
01_002 建模代码分析_创建初始化模型
因为精力有限所以只研究书中设定的接口参数,其它的等用到时再追记.
# n_neighbors
# 核心参数,表示匹配到多少个最邻近, 这个数应当不是越大越好,因为要计算每一个邻近数,计算量非常庞大
# 我们用的鸢尾花训练数据中有4个属性来决定花的种类,理论少设置>0, <=4应当就可以,书中说为了
# 先描述功能,暂时用1来简单讲解.
knn = KNeighborsClassifier(n_neighbors=1)
函数帮助来看,所有的参数均有默认值,也就是说,直接这么写[KNeighborsClassifier()]就可以.
01_003 建模代码分析_向模型中填充训练用数据class KNeighborsClassifier(sklearn.neighbors._base.KNeighborsMixin, sklearn.base.ClassifierMixin, sklearn.neighbors._base.NeighborsBase)
| KNeighborsClassifier(n_neighbors=5, *, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=None)
|
| Classifier implementing the k-nearest neighbors vote.
|
| Read more in the :ref:User Guide
.
|
| Parameters
| ----------
| n_neighbors : int, default=5
| Number of neighbors to use by default for :meth:kneighbors
queries.
from sklearn.datasets import load_iris
iris_dataset = load_iris()
X_train, X_test, y_train, y_test = \
train_test_split(iris_dataset['data'],
iris_dataset['target'], random_state=0)
# 给模型设置数据用fit方法, X_train:训练用原始测量数据, y_train:训练用原始测量结果数据
# 为什么不直接用fit(iris_dataset['data'], iris_dataset['target']),这里都是精确数据?
# 可能是要留点测量数据来测试模型吧!!
knn.fit(X_train, y_train)
fit帮助:
In [15]: help(knn.fit)
Help on method fit in module sklearn.neighbors._classification:
fit(X, y) method of sklearn.neighbors._classification.KNeighborsClassifier instance
Fit the k-nearest neighbors classifier from the training dataset.
Parameters
----------
X : {array-like, sparse matrix} of shape (n_samples, n_features) or (n_samples, n_samples) if metric='precomputed'
Training data.
y : {array-like, sparse matrix} of shape (n_samples,) or (n_samples, n_outputs)
Target values.
Returns
-------
self : KNeighborsClassifier
The fitted k-nearest neighbors classifier.
01_004 建模代码分析_简单测试一下模型是否有效
import numpy as np
# 因为创建的模型是用二维数组创建的,所以需要造一个二维数组
# 因为sklearn通吃numpy格式,所以使用numpy创建数组省去不少麻烦
X_new = np.array([[6.3, 2.5, 5., 1.9]])
prediction = knn.predict(X_new)
可以看到输出结果的格式跟训练模型时,[训练用原始测量结果数据]的格式一致,
想要看结果需要用结果index去原始数据的target_names中查找
In [3]: prediction
Out[3]: array([2])
In [4]: print(iris_dataset['target_names'][prediction])
['virginica']
predit帮助
In [16]: help(knn.predict)
Help on method predict in module sklearn.neighbors._classification:
predict(X) method of sklearn.neighbors._classification.KNeighborsClassifier instance
Predict the class labels for the provided data.
Parameters
----------
X : array-like of shape (n_queries, n_features), or (n_queries, n_indexed) if metric == 'precomputed'
Test samples.
Returns
-------
y : ndarray of shape (n_queries,) or (n_queries, n_outputs)
Class labels for each data sample.
02 评估模型
02 001 要怎样评估, 数据录入确认还是批量数据导入确认
X_new = np.array([[6.3, 2.5, 5., 1.9]])
prediction = knn.predict(X_new)
print(iris_dataset['target_names'][prediction])
想验证模型的正确性,每次都像上面这样写一组,然后测一下肯定是不现实的.
那么应当怎么做?
-
首先需要找到批量数据, 用找到的数据进行测试
解决案: 我们在制作模型时只用了训练数据,测试数据从来没用过,也就是说模型中对这部分的数据没有记录在案,所以这些数据等同于批量的新数据,可以用 X_test, y_test 来验证模型 -
验证这些数据的结果是否符合预期
验证这个活肯定不能是人来干,得找一个能够比较结果的函数,书中使用了mean函数
mean函数概要:
mean函数是numpy下的函数,为什么用这个函数?
我理解: K算法转了一圈后返回的结果的格式可能跟创建模型是 y_train或y_test是一致的,不可能自己创造格式,而这些格式最原始都是从numpy演变来的多维数组,因此 *** 作数组的话,还是应当从这个库里优先查找.
mean算法本质上是算平均值的,帮助中并没有提到过数组比对会出什么结果,既然书中这么用了就研究一下
# 一维数组中的各元素,只有完全相同是再回返回1, 也就是100%匹配,一维数组没有部分匹配这一说
In [6]: np.mean([1]==[2])
Out[6]: 0.0
In [7]: np.mean([1]==[1])
Out[7]: 1.0
In [8]: np.mean([1,2,3]==[1,1,2])
Out[8]: 0.0
In [9]: np.mean([1,2,3]==[1,1,3])
Out[9]: 0.0
In [10]: np.mean([1,2,3]==[1,1,3])
Out[10]: 0.0
In [11]:
# 多维数组可以比较每个个体[一维数组]中各个属性[一维后各维数组],可以达到部分匹配的效果
In [11]: a = np.array([[1,2,3]])
In [12]: a = np.array([[1,1,3]])
In [13]: a = np.array([[1,2,3]])
In [14]: b = np.array([[1,1,3]])
In [15]: np.mean(a==b)
Out[15]: 0.6666666666666666
In [16]: a ==b
Out[16]: array([[ True, False, True]])
mean的函数帮助
In [5]: help(np.mean)
Help on function mean in module numpy:
mean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)
Compute the arithmetic mean along the specified axis.
Returns the average of the array elements. The average is taken over
the flattened array by default, otherwise over the specified axis.
`float64` intermediate and return values are used for integer inputs.
Parameters
----------
a : array_like
Array containing numbers whose mean is desired. If `a` is not an
array, a conversion is attempted.
......
......
......
02 002 评估方案
- 使用训练数据再创建一份以训练模型真正创建出来的训练结果.
- 用这个结果同数据样本中分离出来的真实的测量数据进行比较
In [18]: y_pred = knn.predict(X_test)
...: result = np.mean(y_pred==y_test)
...: print(result)
0.9736842105263158
得到的结果是表示模型的匹配精确度,当然等于1是最完美的,但是很多时候达不到这个效果
日常中需要大量的测试数据来训练模型,同过模型创建时的各种属性设置来使模型精度尽量趋近于1.
代码:
# 多维数组基础包
import numpy as np
# 数据表格
import pandas as pd
# 颜色方案
import mglearn
# 绘图
import matplotlib.pyplot as pt
# 机器学习 数据模型
from sklearn.datasets import load_iris
# 机器学习 数据分离
from sklearn.model_selection import train_test_split
# 机器学习 K临近算法
from sklearn.neighbors import KNeighborsClassifier
# 使用数据训练库里的实例数据
iris_dataset = load_iris()
# 将训练数据打乱,分成两份 75% 25%,
# X_train y_train 为训练数据和训练结果
# Y_train y_test 为测试数据和测试结果
X_train, X_test, y_train, y_test = \
train_test_split(iris_dataset['data'],
iris_dataset['target'], random_state=0)
# 创建数据表单
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
# 使用数据表单创建散点图
grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='0',
hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
# 需要看散点图就把这行去掉这行注释
# 显示散点图
# pt.show()
# 初始化K邻近算法类
knn = KNeighborsClassifier(n_neighbors=1)
# 使用训练数据设置模型
knn.fit(X_train, y_train)
# 通过录入方式简单测试一下模型
X_new = np.array([[6.3, 2.5, 5., 1.9]])
# 使用模型创建模型输出的训练数据
prediction = knn.predict(X_new)
print(prediction)
print(iris_dataset['target_names'][prediction])
# 使用模型创建模型输出的训练数据
y_pred = knn.predict(X_test)
# 比对模型输出的训练数据和实际分离训练数据之间的相似度
result = np.mean(y_pred == y_test)
print(result)
以上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)