机器学习 从入门到精通 day_01
1. 机器学习介绍与定义
1.1 机器学习定义
机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。
机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等算法。
机器学习的基本思路是模仿人类学习行为的过程,如我们在现实中的新问题一般是通过经验归纳,总结规律,从而预测未来的过程。机器学习的基本过程如下:
1.2 机器学习的发展历史
从机器学习发展的过程上来说,从上世纪50年代的图灵测试提出、塞缪尔开发的西洋跳棋程序,标志着机器学习正式进入发展期。
60年代中到70年代末的发展几乎停滞。
80年代使用神经网络反向传播(BP)算法训练的多参数线性规划(MLP)理念的提出将机器学习带入复兴时期。
90年代提出的“决策树”(ID3算法),再到后来的支持向量机(SVM)算法,将机器学习从知识驱动转变为数据驱动的思路。
21世纪初Hinton提出深度学习(Deep Learning),使得机器学习研究又从低迷进入蓬勃发展期。
从2012年开始,随着算力提升和海量训练样本的支持,深度学习(Deep Learning)成为机器学习研究热点,并带动了产业界的广泛应用。
1.3 机器学习分类
机器学习经过几十年的发展,衍生出了很多种分类方法,这里按学习模式的不同,可分为监督学习、半监督学习、无监督学习和强化学习。
1.3.1 监督学习
监督学习(Supervised Learning)是从有标签的训练数据中学习模型,然后对某个给定的新数据利用模型预测它的标签。如果分类标签精确度越高,则学习模型准确度越高,预测结果越精确。
监督学习主要用于回归和分类,常见的监督学习的回归算法有线性回归、回归树、K邻近、Adaboost、神经网络等,常见的监督学习的分类算法有朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。
1.3.2 半监督学习
半监督学习(Semi-Supervised Learning)是利用少量标注数据和大量无标注数据进行学习的模式。
半监督学习侧重于在有监督的分类算法中加入无标记样本来实现半监督分类。
常见的半监督学习算法有Pseudo-Label、Π-Model、Temporal Ensembling、Mean Teacher、VAT、UDA、MixMatch、ReMixMatch、FixMatch等。
1.3.3 无监督学习
无监督学习(Unsupervised Learning)是从未标注数据中寻找隐含结构的过程,无监督学习主要用于关联分析、聚类和降维。
常见的无监督学习算法有稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。
1.3.4 强化学习
强化学习(Reinforcement Learning)类似于监督学习,但未使用样本数据进行训练,是是通过不断试错进行学习的模式。
在强化学习中,有两个可以进行交互的对象:智能体(Agnet)和环境(Environment),还有四个核心要素:策略(Policy)、回报函数(收益信号,Reward Function)、价值函数(Value Function)和环境模型(Environment Model),其中环境模型是可选的。
强化学习常用于机器人避障、棋牌类游戏、广告和推荐等应用场景中。
为了便于读者理解,用灰色圆点代表没有标签的数据,其他颜色的圆点代表不同的类别有标签数据。
1.4 机器学习需要具备的基础的知识,如何学习机器学习
机器学习涉及到线性代数、微积分、概率和统计。
学习机器学习需要掌握一定的数学和编程基础。以下是一些建议,帮助您开始学习机器学习:
学习数学基础:了解线性代数、概率论和统计学等数学概念。这些概念在机器学习中非常重要,可以帮助您理解算法和模型背后的原理。
学习编程语言:掌握至少一种常用的编程语言,如Python或R。这些语言在机器学习中广泛使用,具有丰富的机器学习库和工具。
学习机器学习算法:了解常见的机器学习算法,如线性回归、决策树、支持向量机、神经网络等。学习它们的原理、应用和优缺点。
学习机器学习工具和框架:熟悉常用的机器学习工具和框架,如scikit-learn、TensorFlow、PyTorch等。掌握它们的使用方法和基本操作。
实践项目:通过实践项目来应用所学的知识。选择一些小型的机器学习项目,从数据收集和预处理到模型训练和评估,逐步提升自己的实践能力。
学习资源:利用在线教程、课程、书籍和开放资源来学习机器学习。有很多免费和付费的学习资源可供选择,如Coursera、Kaggle、GitHub上的机器学习项目等。
参与机器学习社区:加入机器学习社区,与其他学习者和专业人士交流经验和学习资源。参与讨论、阅读博客、参加线下活动等,扩展自己的学习网络。
持续学习和实践:机器学习是一个不断发展的领域,保持学习的态度并持续实践非常重要。跟随最新的研究成果、参与竞赛和项目,不断提升自己的技能。
机器学习是一个广阔的领域,需要不断的学习和实践才能掌握。持续投入时间和精力,逐步积累经验和知识,便会逐渐掌握机器学习的技能。
2. scikit-learn工具介绍
-
Python语言机器学习工具
-
Scikit-learn包括许多智能的机器学习算法的实现
-
Scikit-learn文档完善,容易上手,丰富的API接口函数
-
Scikit-learn官网:scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation
-
Scikit-learn中文文档:sklearn
-
scikit-learn中文社区
2.1 scikit-learn安装
参考以下安装教程:https://www.sklearncn.cn/62/
下载:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
2.2 Scikit-learn包含的内容
3. 数据集
3.1 sklearn玩具数据集介绍
玩具数据集的数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取。
函数 | 返回 |
load_boston(*[, return_X_y]) | 加载并返回波士顿房价数据集(回归)(高版本已弃用) |
load_iris(*[, return_X_y, as_frame]) | 加载并返回鸢尾花数据集(分类) |
load_diabetes(*[, return_X_y, as_frame]) | 加载并返回糖尿病数据集(回归) |
load_digits(*[, n_class, return_X_y, as_frame]) | 加载并返回数字数据集(分类) |
load_linnerud(*[, return_X_y, as_frame]) | 加载并返回linnerud物理锻炼数据集 |
load_wine(*[, return_X_y, as_frame]) | 加载并返回葡萄酒数据集(分类) |
load_breast_cancer(*[, return_X_y, as_frame]) | 加载并返回威斯康星州乳腺癌数据集(分类) |
3.2 sklearn现实世界数据集介绍
现实世界数据集的数据量大,数据只能通过网络获取。
函数 | 说明 |
fetch_olivetti_faces(*[, data_home, ...]) | 从AT&T (分类) 中加载Olivetti人脸数据集 |
fetch_20newsgroups(*[, data_home, subset, ...]) | 从20个新闻组数据集中加载文件名和数据(分类) |
fetch_20newsgroups_vectorized(*[, subset, ...]) | 加载20个新闻组数据集并将其矢量化为令牌计数(分类) |
fetch_lfw_people(*[, data_home, funneled, ...]) | 将标签的面孔加载到Wild(LFW)人脸数据集中(分类) |
fetch_lfw_pairs(*[, subset, data_home, ...]) | 在" Wild(LFW)"对数据集中加载标签的面部(分类) |
fetch_covtype(*[, data_home, ...]) | 加载covertype(制备型数据集)数据集(分类) |
fetch_rcv1(*[, data_home, subset, ...]) | 加载RCV1多标签数据集(分类) |
fetch_kddcup99(*[, subset, data_home, ...]) | 加载kddcup99(网络入侵检测)数据集(分类) |
fetch_california_housing(*[, data_home, ...]) | 加载加利福利亚住房数据集(回归) |
3.3 sklearn加载玩具数据集
示例1:鸢尾花数据
from sklearn.datasets import load_iris
iris = load_iris()#鸢尾花数据
鸢尾花数据集介绍
特征有:
花萼长 sepal length
花萼宽sepal width
花瓣长 petal length
花瓣宽 petal width
三分类:
0-Setosa山鸢尾
1-versicolor变色鸢尾
2-Virginica维吉尼亚鸢尾
iris字典中有几个重要属性:
'''
# data 特征
# feature_names 特征描述
# target 目标
# target_names 目标描述
# DESCR 数据集的描述
# filename 下后到本地保存后的文件名
'''
print(iris.data) # 得到特征
print(iris.feature_names) # 特征描述
print(iris.target) # 目标形状
print(iris.target_names) # 目标描述
print(iris.filename) # iris.csv 保存后的文件名
print(iris.DESCR) # 数据集的描述
下面使用pandas把特征和目标一起显示出来:
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
feature = iris.data
target = iris.target
target.shape=(len(target), 1)
data = np.hstack([feature, target])
cols = iris.feature_names
cols.append("target")
pd.DataFrame(data,columns=cols)
示例2:分析糖尿病数据集
这是回归数据集,有442个样本,有可能就有442个目标值。
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
feature = iris.data
target = iris.target
target.shape=(len(target), 1)
data = np.hstack([feature, target])
cols = iris.feature_names
cols.append("target")
pd.DataFrame(data,columns=cols)
4. sklearn获取现实世界数据集
所有现实世界数据,通过网络才能下载后,默认保存的目录可以使用下面api获取。实际上就是保存到home目录。
from sklearn import datasets
datasets.get_data_home() #查看数据集默认存放的位置
下载时由于数据集的来源为境外,有可能回为网络问题而出问题。
第一次下载会保存的硬盘中,如果第二次下载,因为硬盘中已经保存有了,所以不会再次下载就直接加载成功了。
示例:获取20分类新闻数据
使用函数: sklearn.datasets.fetch_20newsgroups(data_home,subset)
函数参数说明:
data_home:
None
这是默认值,下载的文件路径为 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz”
自定义路径
例如 “./src”, 下载的文件路径为“./20news-bydate_py3.pkz”
subset:
“train”,只下载训练集
“test”,只下载测试集
“all”, 下载的数据包含了训练集和测试集
return_X_y,决定着返回值的情况:
False,这是默认值
True,
函数返值说明:
当参数return_X_y值为False时, 函数返回Bunch对象,Bunch对象中有以下属性
*data:特征数据集, 长度为18846的列表list, 每一个元素就是一篇新闻内容, 共有18846篇
*target:目标数据集,长度为18846的数组ndarray, 第一个元素是一个整数,整数值为[0,20)
*target_names:目标描述,长度为20的list
*filenames:长度为18846的ndarray, 元素为字符串,代表新闻的数据位置的路径
当参数return_X_y值为True时,函数返回值为元组,元组长度为2, 第一个元素值为特征数据集,第二个元素值为目标数据集
示例:
from sklearn.datasets import fetch_20newsgroups # 这是一个20分类的数据
news = fetch_20newsgroups(data_home=None, subset='all')
print(len(news.data)) # 18846
print(news.target.shape) # (18846,)
print(len(news.target_names)) # 20
print(len(news.filenames)) # 18846
5. 本地csv数据
5.1 创建csv文件
方式1:打开计事本,写出如下数据,数据之间使用英文下的逗号, 保存文件后把后缀名改为csv(csv文件可以使用excel打开)
示例:
, 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
方式2:创建excel 文件, 填写数据,以csv为后缀保存文件
5.2 pandas加载csv
使用pandas的read_csv(“文件路径”)函数可以加载csv文件,得到的结果为数据的DataFrame形式。
示例:
pd.read_csv("./src/ss.csv")
6. 数据集的划分
6.1 函数
sklearn.model_selection.train_test_split(*arrays,**options)
参数:
1 *array
这里用于接收1到多个"列表、numpy数组、稀疏矩阵或padas中的DataFrame"。
2 **options, 重要的关键字参数有:
test_size 值为0.0到1.0的小数,表示划分后测试集占的比例
random_state 值为任意整数,表示随机种子,使用相同的随机种子对相同的数据集多次划分结果是相同的。否则多半不同
strxxxx 分层划分,填y
返回值说明:返回值为列表list, 列表长度与形参array接收到的参数数量相关联, 形参array接收到的是什么类型,list中对应被划分出来的两部分就是什么类型
6.2 示例
列表数据集划分:
因为随机种子都使用了相同的整数(22),所以划分的划分的情况是相同的。
示例:
from sklearn.model_selection import train_test_split
data1 = [1, 2, 3, 4, 5]
data2 = ["1a", "2a","3a", "4a", "5a"]
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print(a, b) #[4, 1, 5] [2, 3]
a, b = train_test_split(data2, test_size=0.4, random_state=22)
print(a, b) #['4a', '1a', '5a'] ['2a', '3a']
a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22)
print(a,b,c,d) #['4a', '1a', '5a'] ['2a', '3a']
ndarray 数据集划分:
划分前和划分后的数据类型是相同的,data1为list,划分后的a、b也是list;data2为ndarray,划分后的c、d也是ndarray 。
示例:
from sklearn.model_selection import train_test_split
import numpy as np
data1 = [1, 2, 3, 4, 5]
data2 = np.array(["1a", "2a","3a", "4a", "5a"])
a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22)
print(a, b, c, d) #[4, 1, 5] [2, 3] ['4a' '1a' '5a'] ['2a' '3a']
print(type(a), type(b), type(c), type(d)) #<class 'list'> <class 'list'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>
二维数组数据集划分:
train_test_split只划分第一维度,第二维度保持不变。
示例:
from sklearn.model_selection import train_test_split
import numpy as np
data1 = np.arange(1, 16, 1)
data1.shape=(5,3)
print(data1)
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("a=\n", a)
print("b=\n", b)
DataFrame 数据集划分:
可以划分DataFrame, 划分后的两部分还是DataFrame。
示例:
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
data1 = np.arange(1, 16, 1)
data1.shape=(5,3)
data1 = pd.DataFrame(data1, index=[1,2,3,4,5], columns=["one","two","three"])
print(data1)
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("\n", a)
print("\n", b)
字典数据集划分:
可以划分非稀疏矩阵,用于将字典列表转换为特征向量。这个转换器主要用于处理类别数据和数值数据的混合型数据集。
1. 对于类别特征DictVectorizer
会为每个不同的类别创建一个新的二进制特征,如果原始数据中的某个样本具有该类别,则对应的二进制特征值为1,否则为0。
2. 对于数值特征保持不变,直接作为特征的一部分,这样,整个数据集就被转换成了一个适合机器学习算法使用的特征向量形式。
示例:
from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':20},
{'city':'重庆','age':33, 'temperature':60},
{'city':'北京', 'age':42, 'temperature':80},
{'city':'上海', 'age':22, 'temperature':70},
{'city':'成都', 'age':72, 'temperature':40},
]
transfer = DictVectorizer(sparse=True)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
x = data_new.toarray()
print(type(x))
print(x)
a, b = train_test_split(data_new, test_size=0.4, random_state=22)
print(a)
print("\n", b)
# data_new.toarray()是ndarray
a, b = train_test_split(data_new.toarray(), test_size=0.4, random_state=22)
print(a)
print("\n", b)
鸢尾花数据集划分:
示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
list = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
#x_train训练特征数据集,x_test测试特征数据集, y_train训练目标数据集,y_test测试目标数据集,
x_train, x_test, y_train, y_test = list
#打印结果为: (120, 4) (30, 4) (120,) (30,)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
现实世界数据集划分:
示例:
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
import numpy as np
news = fetch_20newsgroups(data_home=None, subset='all')
list = train_test_split(news.data, news.target,test_size=0.2, random_state=22)
# """
# 返回值是一个list:其中有4个值,分别为训练集特征、测试集特征、训练集目标、测试集目标
# 与iris相同点在于x_train和x_test是列表,而iris是
# """
x_train, x_test, y_train, y_test = list
#打印结果为: 15076 3770 (15076,) (3770,)
print(len(x_train), len(x_test), y_train.shape, y_test.shape)