目录
一、机器学习介绍与定义
1、机器学习定义
机器学习(Machine Learning, ML)是人工智能的一个分支,它通过算法使计算机系统能够从数据中 自动学习和改进 ,而无需明确编程。其核心思想是利用 数据 训练 模型,让模型能够对未知数据进行预测或决策。
机器学习的基本思路是模仿人类学习行为的过程,如我们在现实中的新问题一般是通过经验归纳,总结规律,从而预测未来的过程。机器学习的基本过程如下:
下面这张图可能更好理解
2、机器学习的发展历史
机器学习的历史可以追溯到20世纪50年代,早期的研究主要集中在符号推理和专家系统。随着计算能力的提升和大数据时代的到来,机器学习逐渐成为主流技术,并在图像识别、自然语言处理、推荐系统等领域取得了显著成果。
21世纪初 Hinton 提出 深度学习(Deep Learning),使得机器学习研究又从低迷进入蓬勃发展期。
从2012年开始,随着算力提升和海量训练样本的支持,深度学习(Deep Learning)成为机器学习研究热点,并带动了产业界的广泛应用。
3、机器学习分类
(1)监督学习
监督学习 是指在已知输入和输出的情况下,通过训练模型来预测新输入的输出。常见的任务包括回归和分类。
常见的监督学习的回归算法有线性回归、回归树、K邻近、Adaboost、神经网络等。
常见的监督学习的分类算法有朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。
(2)半监督学习
半监督学习 结合了监督学习和无监督学习的特点,使用 少量标记数据 和 大量未标记数据 进行训练,适用于标注数据昂贵或稀缺的场景。
常见的半监督学习算法有Pseudo-Label、Π-Model、Temporal Ensembling、Mean Teacher、VAT、UDA、MixMatch、ReMixMatch、FixMatch等。
(3)无监督学习
无监督学习 是指在没有标签数据的情况下,通过分析数据的内在结构来发现模式或规律。常见的任务包括聚类和降维。
常见的无监督学习算法有稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。
(4)强化学习
强化学习 是一种通过试错学习的方法,智能体通过与环境交互,不断调整策略以最大化奖励。典型应用包括游戏AI和机器人控制。
在强化学习中,有两个可以进行交互的对象:智能体(Agnet)和环境(Environment),还有四个核心要素:策略(Policy)、回报函数(收益信号,Reward Function)、价值函数(Value Function)和环境模型(Environment Model),其中环境模型是可选的。
4、机器学习需要具备的知识、如何学习机器学习
学习机器学习需要掌握以下基础知识:
数学基础:线性代数、概率论与统计学。
编程能力:Python是机器学习中最常用的编程语言。
算法理解:熟悉常见机器学习算法的工作原理。
工具使用:熟练使用相关库和框架,如scikit-learn、TensorFlow、PyTorch等。
5、机器学习的应用场合
机器学习广泛应用于各个领域,包括但不限于:
医疗健康:疾病诊断、药物研发。
金融:风险评估、欺诈检测。
零售:个性化推荐、库存管理。
交通:自动驾驶、路线优化。
6、机器学习的趋势
当前机器学习的趋势包括:
深度学习:神经网络在图像、语音和自然语言处理中的广泛应用。
迁移学习:利用预训练模型快速适应新任务。
自动化机器学习(AutoML):降低机器学习的门槛,实现模型构建的自动化。
7、机器学习项目开发步骤
一个典型的机器学习项目通常包括以下步骤:
问题定义:明确要解决的问题。
数据收集:获取相关数据。
数据预处理:清洗、转换和特征工程。
模型选择与训练:选择合适的算法并训练模型。
模型评估:使用验证集或测试集评估模型性能。
模型部署:将模型集成到实际应用中。
二、scikit - learn 工具介绍
1、scikit-learn安装
scikit-learn是一个基于Python的开源机器学习库,安装非常简单,可以通过以下命令安装:
pip install scikit-learn
或者是使用镜像源安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sklearn
2、scikit-learn包含的内容
三、数据集
1、scikit-learn玩具数据集
sklearn提供了多个内置的玩具数据集,用于快速测试和学习机器学习算法。这些数据集通常具有简单的结构和明确的标签,便于理解和实验。
(1)玩具数据集的介绍
数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取
(2)加载玩具数据集
代码示例:
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
print(iris) # 是个字典
# 数据每一朵花有4个特征(特点数据,特征数据)
print(iris.data)
# 特征名称:分别是:萼片长度,萼片宽度,花瓣长度,花瓣宽度
print(iris.feature_names)
# 每一朵花的标签(目标,结果,类别)
print(iris.target)
# 3类标签名称:['setosa' 'versicolor' 'virginica'] 三鸢尾,可变色鸢尾花,维吉尼亚
print(iris.target_names)
结果展示:
一共有150条数据,数量太多,不方便展示,所以我们只展示后面三个的打印输出内容
2、scikit-learn现实世界数据集
(1)现实数据集的介绍
对于现实世界的数据集,sklearn提供了一些接口,可以直接下载和加载。例如,获取20新闻组分类数据集:
(2)加载现实数据集
1、联网数据集
from sklearn.datasets import fetch_20newsgroups
# 获取20新闻组数据集
newsgroups = fetch_20newsgroups(subset='all')
print("数据样本数量:", len(newsgroups.data))
print("目标类别数量:", len(newsgroups.target_names))
这段代码是从网上去获取数据集,由于是外网所以速度可能较慢,这里我们从本地获取提前下载好的内容看看这个数据集里的内容
示例代码:
from sklearn.datasets import fetch_20newsgroups
# 获取数据集
news_data = fetch_20newsgroups(data_home="../src", subset='all')
# 展示数据集中的第一条数据
print(news_data.data[0])
结果展示:
2、自己的数据集
除了从网上获取数据集,我们是不是自己在平时也会有一些数据文件,诸如 excel这类的文件,我们也可以读取其中的数据。
示例代码:
import pandas as pd
# 读取数据集
data_f = pd.read_csv('../src/ss.csv')
# 转换为矩阵
data = data_f.to_numpy()
# 获取特征向量x和标签向量y
x = data[:, :2]
y = data[:, 2]
print("x:\n",x)
print("y:\n",y)
结果展示:
3、数据集的划分
在机器学习中,通常需要将数据集划分为 训练集 和 测试集 ,以便评估模型的泛化能力。
(1)函数
scikit-learn提供了train_test_split
函数,用于随机划分数据集。
from sklearn.model_selection import train_test_split
# 假设X是特征矩阵,y是目标向量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
(2)示例
代码示例:
from sklearn.model_selection import train_test_split
# 数据集划分1
a = [10, 20, 30, 40, 50, 60, 70]
a_train, a_test = train_test_split(a)
print(a_train, a_test)
# 数据集划分2
a = [10, 20, 30, 40, 50, 60, 70]
b = [1, 2, 3, 4, 5, 6, 7]
a_train, a_test, b_train, b_test = train_test_split(a, b)
print(a_train, a_test, b_train, b_test)
# 数据集划分3
a = [10, 20, 30, 40, 50, 60, 70]
b = [1, 2, 3, 4, 5, 6, 7]
a_train, a_test, b_train, b_test = train_test_split(a, b, shuffle=False,test_size=0.2, random_state=42)
print(a_train, a_test, b_train, b_test)
# 数据集划分的函数可以允许传入data_frame、list、ndarray、tuple 等等能取下标的都可以
结果展示:
我们再来划分一个鸢尾花的数据集:
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")
# 创建DataFrame
pd.DataFrame(data,columns=cols)
结果展示:
四、特征工程
特征工程是机器学习中一个至关重要的环节,它涉及从原始数据中提取、转换和选择特征,以提高模型的性能。良好的特征工程可以显著提升模型的准确性和泛化能力,而糟糕的特征工程可能导致模型表现不佳。
一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程
特征工程是将任意数据(如文本或图像)转换为可用于机器学习的 数字 特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。
特征工程步骤为:
特征提取, 如果不是像dataframe那样的数据,要进行特征提取,比如字典特征提取,文本特征提取
无量纲化(预处理)
归一化
标准化
降维
底方差过滤特征选择
主成分分析-PCA降维
1、特征工程API
实例化转换器对象,转换器类有很多,都是Transformer的子类, 常用的子类有:、
DictVectorizer 字典特征提取CountVectorizer 文本特征提取TfidfVectorizer TF-IDF文本特征词的重要程度特征提取MinMaxScaler 归一化StandardScaler 标准化VarianceThreshold 底方差过滤降维PCA 主成分分析降维
转换器对象调用fit_transform()进行转换, 其中fit用于计算数据,transform进行最终转换
data_new = transfer.fit_transform(data)
可写成
transfer.fit(data)
data_new = transfer.transform(data)
(1)字典列表特征提取
DictVectorizer
是一种用于将字典格式的数据转换为数值矩阵的工具,常用于处理稀疏数据。
from sklearn.feature_extraction import DictVectorizer
data = [
{"city": "北京", "temperature": 100,"age": 18,"gdp":100},
{"city": "上海", "temperature": 80,"age": 19,"gdp":200},
{"city": "广州", "temperature": 70,"age": 20, "gdp":300},
{"city": "深圳", "temperature": 60,"age": 21, "gdp":400}
]
# 模型研究x 与 y的关系之前,必须保证了x,y中全是数字
# 创建转换器,sparse=True,表示返回的是稀疏矩阵
transfer = DictVectorizer(sparse=True)
data = transfer.fit_transform(data)
print(data)
# 将稀疏矩阵转换为二维数组
print(data.toarray())
print(transfer.get_feature_names_out())# 转后的数据的特征名称
(2)文字词频特征提取
CountVectorizer
是一种用于文本特征提取的工具,它将文本转换为 词频矩阵。
1、英文文本提取
from sklearn.feature_extraction.text import CountVectorizer
data = ["hello my name is hello world ","ai is very good"]
counter = CountVectorizer()
data = counter.fit_transform(data)
# 转换为数字之后默认为稀疏矩阵
print(data)
# 将稀疏矩阵转换为二维数组
print(data.toarray())
print(counter.get_feature_names_out())
2、中文文本提取
英文文本可以通过 “空格” 来自然分割开两个不同的单词,实现词频的统计,但是中文文本的词语之间是没有空格的,所以我们导入“jieba”这个工具来帮助我们进行分词。
import jieba
from sklearn.feature_extraction.text import CountVectorizer
# 创建分词函数, 将经过分词处理的词语通过空格连接起来
def cut_words(words):
return " ".join(jieba.cut(words))
# 创建数据
data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
# 通过推导式对data进行分词处理
data = [cut_words(words) for words in data]
print(data)
transfer = CountVectorizer()
data = transfer.fit_transform(data)
print(data.toarray())
# 查看特征名称
print(transfer.get_feature_names_out())
(3)文字稀有度特征提取
TfidfVectorizer
是一种结合了词频(TF)和逆文档频率(IDF)的文本特征提取工具,能够更好地反映单词的重要性。
1、算法
2、API的简单使用
import jieba
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def cut_words(words):
return " ".join(jieba.cut(words))
data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data = [cut_words(words) for words in data]
print(data)
transfer = TfidfVectorizer()
data = transfer.fit_transform(data) # 训练并转换
print(data.toarray())
print(transfer.get_feature_names_out())
3、自主实现 TfidfVectorizer
我们既然已经知道了稀有度的计算公式,那我们是不是可以自己编写出这个函数呢?
import jieba
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import normalize
def cut_words(words): # 剪切函数
return " ".join(jieba.cut(words))
def myTfidfVectorizer(data): # 自定义TF-IDF向量化函数
# 提取词频
transfer = CountVectorizer() # 创建转换器
data = transfer.fit_transform(data) # 将数据进行转换,文字转换为数字,输出的是稀疏矩阵sparse
TF = data.toarray() # 将稀疏矩阵sparse转换为普通numpy二维数组
print(TF) # 打印词频
# 提取IDF
IDF = np.log((len(TF)+1)/(np.sum(TF != 0, axis=0)+1))+1 # 计算IDF
tf_idf = TF * IDF # 计算TF-IDF
tf_idf = normalize(tf_idf, norm="l2") # 对TF-IDF进行归一化
return tf_idf # 返回TF-IDF
data = ["事业教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data = [cut_words(words) for words in data]
print(data)
data = myTfidfVectorizer(data)
print(data)
效果展示:
2、无量纲化
无量纲化(Normalization)和标准化(Standardization)是常见的数据预处理方法,用于缩放特征值的范围,使不同量级的特征具有可比性。
(1)MinMaxScaler 归一化
MinMaxScaler 使用以下公式将特征缩放到 [0, 1]
范围:
示例代码:
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2],
[-0.5, 6],
[0, 10],
[1, 18]]
# 创建转换器 设置范围
transfer = MinMaxScaler(feature_range=(-10,10))
data = transfer.fit_transform(data)
print(data)
结果展示:
(2)normalize 归一化
<1> L1 归一化
L1 归一化将每个样本的特征按其绝对值之和进行缩放:
<2> L2 归一化
L2 归一化将每个样本的特征按其平方和的平方根进行缩放:
<3> max 归一化
max 归一化将每个样本的特征按其最大值进行缩放:
示例代码:
from sklearn.preprocessing import normalize
from sklearn.datasets import load_iris
x, y = load_iris(return_X_y=True)
# 归一化,使用l1方法
x = normalize(x, norm="max", axis=0)
print(x)
结果展示:
(3)StandardScaler 标准化
StandardScaler 使用以下公式将特征缩放到均值为 0,标准差为 1:
其中,μ 是特征的均值,σ 是特征的标准差。
示例代码:
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
data = np.random.randint(0, 10, size=(20, 4))
print(data)
# 划分数据
x_train, x_test = train_test_split(data, test_size=0.2)
# 创建数据
x_new = np.array([[10,2,3,4]])
print(x_train, x_test)
# 创建转换器
transfer = StandardScaler()
# 训练模型
transfer.fit(x_train)
x_train = transfer.transform(x_train)
print(x_train)
# 用x_train训练模型(假装)
# 用训练的模型预测:x_test
x_test = transfer.transform(x_test)# 用的x_train的均值和标准差
x_new = transfer.transform(x_new) # 用x_train的均值和标准差
结果展示:
五、总结
本文介绍了机器学习的基本概念、发展历程、分类以及应用场景,并详细讲解了如何使用scikit-learn库进行数据集的加载和划分。通过这些基础知识的学习,读者可以快速上手机器学习项目,为后续的深入学习打下坚实的基础。
希望这篇博客对你有所帮助!如果有任何问题,欢迎留言讨论。