**
交流学术思想,加入Q群 号:815783932
**
过拟合的原因有很多总结了一下几点:
1.样本不平衡导致。这个是重中之重 ,非常非常非常非常重要
2.训练集和测试集样本分布不同。
3.模型太过于复杂。
4.过度训练。
随着本身实验的进行,对于代码实验做得较多的同学,基本上最终都能发现基本上过拟合问题都来源于数据源的问题。
现代的算法序列挖掘算法,分类回归等深度学习算法发展至今已经较为成熟。无论是torch还是tensor 默认参数就已经能达到较好的效果。因此 对数据本源的研究是重中之重。
chatgpt的出现,能看出来现在大模型的应用得到了较好的应用。数据源的质量关乎模型训练的效果。
解决样本不平衡的方法有很多:
1.通过欠采样和过采样解决样本分部不平衡。
原理:需要模型算法更新迭代参数的时候,不去向莫一方向进行偏离。
过采样:
将样本进行重复,假设问题是个二分类问题1W条数据 正例有2000条,负例有8000条,存在样本不平衡问题,过采样就是通过重复样例较少的样本,当数据集较少的时候,需要用到过采样的方式。
**欠采样:****本身理解就是通过删除一部分类别的样本,来到达到样本平衡
随机欠采样(Random undersampling):从多数类别中随机选择一部分样本与少数类别样本一起组成新的训练集。
意向性欠采样(Cluster-based undersampling):对多数类别样本进行聚类,然后从每个聚类中选择一个样本与少数类别样本一起组成新的训练集。
深度学习欠采样(Deep learning-based undersampling):使用深度学习模型对多数类别样本进行分类,然后选择分类错误的样本与少数类别样本一起组成新的训练集。
需要注意的是,欠采样可能会导致信息丢失和过拟合问题,因此需要谨慎使用,并根据具体情况选择合适的方法和参数。
下面是欠采样的代码示例
from imblearn.under_sampling import RandomUnderSampler
from sklearn.datasets import make_classification
# 创建一个不平衡的样本集
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
# 显示样本集类别分布情况
print("Original dataset shape: ", X.shape, y.shape)
print("Original dataset class distribution: ", {i: len(y[y==i]) for i in set(y)})
# 进行欠采样
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
# 显示欠采样后样本集类别分布情况
print("Resampled dataset shape: ", X_resampled.shape, y_resampled.shape)
print("Resampled dataset class distribution: ", {i: len(y_resampled[y_resampled==i]) for i in set(y_resampled)})
**
**过采样:****本身理解就是是指在不改变数据分布情况的前提下,从原始数据集中随机复制一部分样本
**
随机过采样(Random oversampling):从少数类别中随机选择一部分样本进行复制,以增加样本数量。
SMOTE(Synthetic Minority Over-sampling Technique):通过插值方法生成新的少数类别样本,以增加样本数量。具体地,SMOTE算法会对少数类别样本进行分析,对每个少数类别样本随机选择若干个最近邻样本,然后根据这些最近邻样本生成新的合成样本。
ADASYN(Adaptive Synthetic Sampling):类似于SMOTE,但不同之处在于ADASYN在生成新的合成样本时,会根据每个少数类别样本的密度来确定生成新样本的数量。
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
# 创建一个不平衡的样本集
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
# 显示样本集类别分布情况
print("Original dataset shape: ", X.shape, y.shape)
print("Original dataset class distribution: ", {i: len(y[y==i]) for i in set(y)})
# 进行过采样
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# 显示过采样后样本集类别分布情况
print("Resampled dataset shape: ", X_resampled.shape, y_resampled.shape)
print("Resampled dataset class distribution: ", {i: len(y_resampled[y_resampled==i]) for i in set(y_resampled)})