乐趣区

关于机器学习:机器学习算法KNN鸢尾花种类预测案例和特征预处理全md文档笔记已分享附代码

本系列文章 md 笔记(已分享)次要探讨机器学习算法相干常识。机器学习算法文章笔记以算法、案例为驱动的学习,随同浅显易懂的数学知识,让大家把握机器学习常见算法原理,利用 Scikit-learn 实现机器学习算法的利用,联合场景解决理论问题。包含 K - 近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚类算法。K- 近邻算法的间隔公式,利用 LinearRegression 或 SGDRegressor 实现回归预测,利用 LogisticRegression 实现逻辑回归预测,利用 DecisionTreeClassifier 实现决策树分类,利用 RandomForestClassifie 实现随机森林算法,利用 Kmeans 实现聚类工作。

全套笔记和代码自取移步 gitee 仓库:gitee 仓库获取残缺文档和代码

感兴趣的小伙伴能够自取哦,欢送大家点赞转发~


共 7 章,44 子模块

K- 近邻算法

学习指标

  • 把握 K - 近邻算法实现过程
  • 晓得 K - 近邻算法的间隔公式
  • 晓得 K - 近邻算法的超参数 K 值以及取值问题
  • 晓得 kd 树实现搜寻的过程
  • 利用 KNeighborsClassifier 实现分类
  • 晓得 K - 近邻算法的优缺点
  • 晓得穿插验证实现过程
  • 晓得超参数搜寻过程
  • 利用 GridSearchCV 实现算法参数的调优

1.6 案例:鸢尾花品种预测 – 数据集介绍

本试验介绍了应用 Python 进行机器学习的一些基本概念。在本案例中,将应用 K -Nearest Neighbor(KNN)算法对鸢尾花的品种进行分类,并测量花的特色。

本案例目标:

  1. 遵循并了解残缺的机器学习过程
  2. 对机器学习原理和相干术语有根本的理解。
  3. 理解评估机器学习模型的根本过程。

1 案例:鸢尾花品种预测

Iris 数据集是罕用的分类试验数据集,由 Fisher, 1936 收集整理。Iris 也称鸢尾花卉数据集,是一类多重变量剖析的数据集。对于数据集的具体介绍:

2 scikit-learn 中数据集介绍

2.1 scikit-learn 数据集 API 介绍

  • sklearn.datasets

    • 加载获取风行数据集
    • datasets.load_*()

      • 获取小规模数据集,数据蕴含在 datasets 里
    • datasets.fetch_*(data_home=None)

      • 获取大规模数据集,须要从网络上下载,函数的第一个参数是 data_home,示意数据集下载的目录, 默认是 ~/scikit_learn_data/
2.1.1 sklearn 小数据集
  • sklearn.datasets.load_iris()

加载并返回鸢尾花数据集

2.1.2 sklearn 大数据集
  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

    • subset:’train’ 或者 ’test’,’all’,可选,抉择要加载的数据集。
    • 训练集的“训练”,测试集的“测试”,两者的“全副”

2.2 sklearn 数据集返回值介绍

  • load 和 fetch 返回的数据类型 datasets.base.Bunch(字典格局)

    • data:特色数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
    • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
    • DESCR:数据形容
    • feature_names:特色名, 新闻数据,手写数字、回归数据集没有
    • target_names:标签名
from sklearn.datasets import load_iris
  
  
# 获取鸢尾花数据集
  
  
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
  
  
# 返回值是一个继承自字典的 Bench
  
  
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特色的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的形容:\n", iris.DESCR)

2.3 查看数据分布

通过创立一些图,以查看不同类别是如何通过特色来辨别的。在现实状况下,标签类将由一个或多个特色对完满分隔。在事实世界中,这种现实状况很少会产生。

  • seaborn 介绍

    • Seaborn 是基于 Matplotlib 外围库进行了更高级的 API 封装,能够让你轻松地画出更丑陋的图形。而 Seaborn 的丑陋次要体现在配色更加难受、以及图形元素的款式更加细腻。
    • 装置 pip3 install seaborn
    • seaborn.lmplot() 是一个十分有用的办法,它会在绘制二维散点图时,主动实现回归拟合

      • sns.lmplot() 里的 x, y 别离代表横纵坐标的列名,
      • data= 是关联到数据集,
      • hue=* 代表依照 species 即花的类别分类显示,
      • fit_reg= 是否进行线性拟合。
    • 参考链接: api 链接
%matplotlib inline  
  
  
# 内嵌绘图
  
  
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

  
  
# 把数据转换成 dataframe 的格局
  
  
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target

def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花品种分布图')
    plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

2.4 数据集的划分

机器学习个别的数据集会划分为两个局部:

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型测验时应用,用于 评估模型是否无效

划分比例:

  • 训练集:70% 80% 75%
  • 测试集:30% 20% 25%

数据集划分 api

  • sklearn.model_selection.train_test_split(arrays, *options)

    • x 数据集的特征值
    • y 数据集的标签值
    • test_size 测试集的大小,个别为 float
    • random_state 随机数种子, 不同的种子会造成不同的随机采样后果。雷同的种子采样后果雷同。
    • return 测试集特色训练集特征值值,训练标签,测试标签(默认随机取)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
  
  
# 1、获取鸢尾花数据集
  
  
iris = load_iris()
  
  
# 对鸢尾花数据集进行宰割
  
  
  
  
# 训练集的特征值 x_train 测试集的特征值 x_test 训练集的目标值 y_train 测试集的目标值 y_test
  
  
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("x_train:\n", x_train.shape)
  
  
# 随机数种子
  
  
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种子不统一:\n", x_train == x_train1)
print("如果随机数种子统一:\n", x_train1 == x_train2)

1.7 特色工程 - 特色预处理

1 什么是特色预处理

1.1 特色预处理定义

scikit-learn 的解释

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻译过去:通过 一些转换函数 将特色数据 转换成更加适宜算法模型 的特色数据过程

为什么咱们要进行归一化 / 标准化?
  • 特色的 单位或者大小相差较大,或者某特色的方差相比其余的特色要大出几个数量级 容易影响(摆布)指标后果,使得一些算法无奈学习到其它的特色
举例:约会对象数据

咱们须要用到一些办法进行 无穷纲化 使不同规格的数据转换到同一规格

1.2 蕴含内容(数值型数据的无穷纲化)

  • 归一化
  • 标准化

1.3 特色预处理 API

sklearn.preprocessing

2 归一化

2.1 定义

通过对原始数据进行变换把数据映射到 (默认为[0,1]) 之间

2.2 公式

作用于每一列,max 为一列的最大值,min 为一列的最小值, 那么 X’’为最终后果,mx,mi 别离为指定区间值默认 mx 为 1,mi 为 0

那么怎么了解这个过程呢?咱们通过一个例子

2.3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

    • MinMaxScalar.fit_transform(X)

      • X:numpy array 格局的数据[n_samples,n_features]
    • 返回值:转换后的形态雷同的 array

2.4 数据计算

咱们对以下数据进行运算,在 dating.txt 中。保留的就是之前的约会对象数据

milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
  • 剖析

1、实例化 MinMaxScalar

2、通过 fit_transform 转换

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    """
    归一化演示
    :return: None
    """data = pd.read_csv("dating.txt")
    print(data)
    # 1、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=(2, 3))
    # 2、调用 fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("最小值最大值归一化解决的后果:\n", data)

    return None

返回后果:

milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
3     75136  13.147394    0.428964       1
..      ...        ...         ...     ...
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
最小值最大值归一化解决的后果:[[2.44832535  2.39805139  2.56233353]
 [2.15873259  2.34195467  2.98724416]
 [2.28542943  2.06892523  2.47449629]
 ..., 
 [2.29115949  2.50910294  2.51079493]
 [2.52711097  2.43665451  2.4290048]
 [2.47940793  2.3768091   2.78571804]]
问题:如果数据中异样点较多,会有什么影响?

2.5 归一化总结

留神最大值最小值是变动的,另外,最大值与最小值非常容易受异样点影响,所以这种办法鲁棒性较差,只适宜传统准确小数据场景。

怎么办?

3 标准化

3.1 定义

通过对原始数据进行变换把数据变换到均值为 0, 标准差为 1 范畴内

3.2 公式

作用于每一列,mean 为平均值,σ 为标准差

所以回到方才异样点的中央,咱们再来看看标准化

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么后果显然会产生扭转
  • 对于标准化来说:如果出现异常点,因为具备肯定数据量,大量的异样点对于平均值的影响并不大,从而方差扭转较小。

3.3 API

  • sklearn.preprocessing.StandardScaler()

    • 解决之后每列来说所有数据都汇集在均值 0 左近标准差差为 1
    • StandardScaler.fit_transform(X)

      • X:numpy array 格局的数据[n_samples,n_features]
    • 返回值:转换后的形态雷同的 array

3.4 数据计算

同样对下面的数据进行解决

  • 剖析

1、实例化 StandardScaler

2、通过 fit_transform 转换

import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand_demo():
    """
    标准化演示
    :return: None
    """data = pd.read_csv("dating.txt")
    print(data)
    # 1、实例化一个转换器类
    transfer = StandardScaler()
    # 2、调用 fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("标准化的后果:\n", data)
    print("每一列特色的平均值:\n", transfer.mean_)
    print("每一列特色的方差:\n", transfer.var_)

    return None

返回后果:

milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
标准化的后果:
 [[0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ..., 
 [-0.32171752  0.96431572  0.06952649]
 [0.65959911  0.60699509 -0.20931587]
 [0.46120328  0.31183342  1.00680598]]
每一列特色的平均值:[3.36354210e+04   6.55996083e+00   8.32072997e-01]
每一列特色的方差:[4.81628039e+08   1.79902874e+01   2.46999554e-01]

3.5 标准化总结

在已有样本足够多的状况下比较稳定,适宜古代嘈杂大数据场景。

未完待续,同学们请期待下一期

全套笔记和代码自取移步 gitee 仓库:gitee 仓库获取残缺文档和代码

感兴趣的小伙伴能够自取哦,欢送大家点赞转发~

退出移动版