公众号:机器学习杂货店 作者:Peter 编辑:Peter
持续更新《Python深度学习》一书的精华内容,仅作为学习笔记分享。
本小节是第5篇:主要是介绍机器学习/深度学习的基础知识,主要包含:
监督学习supervised learning:机器学习中最常见的类型,它可以学会将输入数据映射到已知目标annotation。比如回归问题和分类问题(二分类、多分类问题等)是最常见的监督学习的例子。
其他监督学习的应用例子:
分类问题和回归问题的常用术语:
是否
两个互斥的类别8~128
,样本数一般是2的倍数,便于GPU上的内存分配。无监督学习是机器学习任务的一种,它从无标记的训练数据中推断结论,它是进行数据分析的必要步骤。无监督学习的两种主要方法:降维dimensionality reduction和聚类clustering。
自监督学习是没有人工标注的标签的监督学习。但是标签是仍然存在的,标签是在输入数据中生成的。通常使用的是启发式算法生成。
自监督学习是另一种类型的无监督学习,其通过利用数据本身的结构和相关性来生成监督信号,从而进行训练。在自监督学习中,通常会设计一个预定义的变换(或变换组合),该变换可以将输入数据转换为另一种具有明显差异的数据,然后训练一个模型来预测这个变换后的数据。 自监督学习的核心思想是利用大规模无标签数据,挖掘数据自身的结构信息和相关性,生成能够指导模型训练的监督信息,以此提高无监督学习效果。自监督学习是一种重要的无监督学习方法,在自然语言处理、计算机视觉等多个领域都得到了广泛的应用。
自编码器autoencoder是很有名的自监督学习的例子。
强化学习(Reinforcement Learning, RL)是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。常见模型是标准的马尔可夫决策过程(Markov Decision Process, MDP)。
强化学习可以分为基于模式的强化学习(model-based RL)和无模式强化学习(model-free RL),以及主动强化学习(active RL)和被动强化学习(passive RL)。
求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。深度学习模型可以在强化学习中得到使用,形成深度强化学习。
一个现象:模型在训练集上性能始终在提高,但是在验证集表现得不好,即出现了过拟合overfit。
机器学习的目的是得到泛化generalize的模型,即在前所未见的数据集表现良好。
数据集的划分:
如果数据本身就很少,可以使用交叉验证的方式:简单的留出验证、K折验证、以及带有打乱数据顺序的重复K折验证
留出一定的比例作为测试集;在剩余的数据上训练模型
# 留出验证代码实现
num_validation_sample = 10000
np.random.shuffle(data) # 打乱数据
validation_data = data[:num_validation_sample] # 定义验证集-前面10000个数据
data = data[num_validation_sample:]
train_data = data.copy() # 定义训练集
model = get_model()
# 在训练集上训练模型;并且在验证集上评估模型
model.train(train_data)
validation_score = model.evaluate(validation_data)
# 调节模型-重新训练-再评估模型
model = get_model()
model.train(np.concatenate([train_data,validation_data])) # 一旦调节好超参数,通常在所有非测试集上从头训练,得到最终的模型
test_score = model.evaluate(test_data)
方法简单,一个缺点:如果数据本身就很少,验证集和测试集的数据就太少了,无法从统计学上代表数据。
如果在划分数据前进行不同的随机打乱,最终得到的模型性能差别将会很大。
思想:K折交叉验证是一种用于评估机器学习模型性能的技术,其基本思想是将原始数据集分成K个子集,每次选择其中的K-1个子集作为训练数据集,剩余的一个子集作为测试数据集,这样共进行K次交叉验证。每次实验都会得到一个错误率,最终的评估结果是这K次实验错误率的平均值。
这种技术可以有效地避免过拟合和欠拟合,并且可以评估模型的泛化能力。
# k折交叉验证
k = 5
num_validation_samples = len(data) // k
np.random.shuffle(data)
validation_scores = []
for fold in range(k):
validation_data = data[num_validation_samples*fold:num_validation_samples*(fold+1)] # 验证集数据
train_data = data[:num_validation_samples*fold] + data[num_validation_samples*(fold+1):] # 训练集数据
model = get_model()
model.train(train_data) # 基于训练集train_data来训练模型
validation_score = model.evaluate(validation_data) # 验证集评估模型
validation_scores.append(validation_score) # 验证集上得分列表
validation_score = np.mean(validation_scores) # 得分均值
model = model.get_model()
model.train(data) # 基于全部数据data重新训练模型
test_score = model.evaluate(test_data)
注意一点:原始数据分成训练集train、验证集valid和测试集test;先在训练集上进行训练,接着在验证集进行评估;模型通过后,然后在train+valid的完整测非测试集上进行训练,得到最终的模型。
基于sklearn快速实现k折交叉验证一个案例:
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 创建KFold对象
kfold = KFold(n_splits=5)
# 创建模型
model = LogisticRegression()
# 使用K折交叉验证评估模型性能
scores = cross_val_score(model, X, y, cv=kfold)
# 输出平均准确率和标准差
print("Accuracy: %.3f%% (+/-%.3f%%)" % (scores.mean()*100.0, scores.std()*100.0/len(scores)))
带有打乱数据的重复K折交叉验证是一种用于评估机器学习模型性能的更加严谨的技术。
它与K折交叉验证类似,但是在每次交叉验证中,数据集的顺序会被随机打乱,然后再进行K折划分。这样做可以避免由于数据集顺序的影响而产生偏差的评估结果。
这种方法总共需要训练和评估K*P
个模型(P代表重复次数)。
基于sklearn实现:
from sklearn.model_selection import RepeatedKFold
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 创建RepeatedKFold对象
rbf = RepeatedKFold(n_splits=5, n_repeats=3) # k=5,重复次数为3
# 创建模型
model = LogisticRegression()
# 使用重复K折交叉验证评估模型性能
scores = cross_val_score(model, X, y, cv=rbf)
# 输出平均准确率和标准差
print("Accuracy: %.3f%% (+/-%.3f%%)" % (scores.mean()*100.0, scores.std()*100.0/len(scores)))
选择模型评估方法时的注意事项:
所有神经网络的输入数据都必须是浮点数张量(极少特殊情况可以是整数张量)。
向量化是一种将数据从一维数组转换为多维数组的数学操作,它可以将原始数据转换为更适合神经网络处理的形式。
具体来说,神经网络的输入数据通常需要是一维数组或者多维数组的形式,其中每个元素对应一个特征。而原始数据往往是一维数组的形式,其中每个元素对应一个样本。因此,为了将原始数据直接输入神经网络进行训练,需要对数据进行向量化操作。
在神经网络中,数据进行标准化(归一化)处理是一个非常重要的步骤。归一化的作用主要是将输入数据的特征缩放到一个相对较小的区间,以提高模型的训练效率和防止出现过拟合现象。具体来说,标准化可以使不同尺度的特征具有相同的尺度,从而使得网络在处理不同特征时能够有相同的学习速率。
比如图像处理中,图像数据被编码在0~255之间的整数,表示灰度值。在输入网络前需要除以255,这样缩放得到0~1范围的浮点数。
输入数据的两个特征:
# numpy数组实现标准化:均值为0,标准差为1
import numpy as np
x -= x.mean(axis=0)
x /= x.std(axis=0)
在处理数据中缺失值的方法,有以下几种常见的方法:
一般来说,神经网络中缺失值设置为0是安全的,只要0不是一个有意义的值。网络从数据学到0表示着缺失数据,并且会忽略这个值。
特征工程是指从原始数据中提取有用的特征,以便能够更好地训练机器学习模型。
这个过程包括从原始数据中选择有用的特征,转换特征以便更容易处理,或者构造新的特征,以提高模型的准确性。
特征工程是建立机器学习模型的第一步,因为它能够使模型的表现与所使用的特征有很大的关系。
机器学习的根本问题是优化和泛化之间的对立。
优化optimization:调节模型,在训练集上得到最佳性能
泛化generalization:训练好的模型在前所未见的数据上的性能好坏。泛化是无法控制的
欠拟合underfit:欠拟合是指机器学习模型在训练数据上的性能不佳,其泛化能力也较差。这意味着模型无法很好地掌握训练数据背后的复杂关系或模式,因此在新数据上的表现也不尽如人意。模型在训练集合验证集都表现得很差。
过拟合overfit:模型在训练集上标签良好,但是验证集上表现得很差。
为了防止模型从训练数据中学到错误或者无关紧要的模式,最优的办法是提供更多的训练数据。模型训练的数据越多,泛化能力自然也越好。
常用降低过拟合的方法叫做正则化regularization,下面介绍几种方法:
减小网络大小是解决过拟合现象的一种常用方法。通过减小网络大小,可以限制模型的复杂度,减少模型对训练数据的过度拟合,从而提高模型在新数据上的泛化能力。
具体来说,减小网络大小可以通过以下几种方式实现:
# 向模型添加L2权重正则化
from keras import regularizers
from keras import layers, models
model = models.Sequential()
model.add(layers.Dense(16,
kernel_regularizer=regularizers.l2(0.001),
activation="relu",
input_shape=(10000,)
))
model.add(layers.Dense(16,
kernel_regularizer=regularizers.l2(0.001),
activation="relu"
))
model.add(layers.Dense(1, activation="sigmoid"))
使用其他权重正则化来替代L2正则化:
from keras import regularizers
regularizers.l1(0.001)
regularizers.l1_l2(l1=0.001,l2=0.001) # 同时进行l1-l2正则化
对某一层使用dropout
,就是在训练过程中对该层的一些输出特征值进行随机舍弃。
比如对向量的dropout
操作:[0.2,0.5,1.3,0.8,1.6]
经过操作后变成[0,0.5,1.3,0,1.6]
,部分元素随机变成0。
被设为0的输出特征的比例称之为dropout rate
,通常取值在0.2~0.5
之间。
在keras中的使用方法:
model = model.Sequential()
model.add(layers.Dense(16,activation="relu",input_shape=(X_trian.shape[1],)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1,activation="sigmoid"))
防止神经网络过拟合的方法总结:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。