01

01,第1张

第一章学习内容整理_建模&预测 01 建模

书中例子如下:

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()]就可以.

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.

01_003 建模代码分析_向模型中填充训练用数据
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.

03 总结

代码:


# 多维数组基础包
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)


以上

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/942859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存