共计 6443 个字符,预计需要花费 17 分钟才能阅读完成。
本系列文章 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 案例:鸢尾花品种预测
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 仓库获取残缺文档和代码
感兴趣的小伙伴能够自取哦,欢送大家点赞转发~