gpt4 book ai didi

python - ANN 实现过度拟合

转载 作者:行者123 更新时间:2023-11-30 09:43:21 25 4
gpt4 key购买 nike

我是 ML 领域的新手,正在学习它,我按照教程制作了一个模型,但结果准确性总是很快跃升至 100%。我在网上搜索并发现根据我的理解我有与模型过度拟合相关的问题。我使用的数据集非常小,来自 UCI 网站,名为“印度肝脏患者数据集”。该数据集包含 600 左右的很少观察值。

我的问题是如何克服数据中的过度拟合。任何帮助将不胜感激,谢谢。

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import scikitplot as skplt
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

df = pd.read_csv("C:/TF/TEST/ILDP.csv")

df["ag_ratio"].fillna("0.6", inplace=True)

df.isnull().sum()

print(df.head())

LD, NLD = df['is_patient'].value_counts()

df_sex = pd.get_dummies(df['gender'])
df_new = pd.concat([df, df_sex], axis=1)

Droop_gender = df_new.drop(labels=['gender'], axis=1)
Droop_gender.columns = ['age', 'tot_bilirubin', 'direct_bilirubin', 'tot_proteins', 'albumin', 'ag_ratio',
'sgpt', 'sgot', 'alkphos', 'Female', 'Male', 'is_patient']

X = Droop_gender.drop('is_patient', axis=1)
y = Droop_gender['is_patient']

print(X.shape)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

classifier = Sequential() # Initialising the ANN

classifier.add(Dense(units=16, kernel_initializer='uniform', activation='relu', input_dim=11))
classifier.add(Dense(units=8, kernel_initializer='uniform', activation='relu'))
classifier.add(Dense(units=6, kernel_initializer='uniform', activation='relu'))
classifier.add(Dense(units=1, kernel_initializer='uniform', activation='sigmoid'))

# compile ANN
classifier.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

# Fitting the data
histroy = classifier.fit(X_train, y_train, batch_size=20, epochs=50)


y_pred = classifier.predict(X_test)
y_pred = [1 if y >= 0.5 else 0 for y in y_pred]

print(classification_report(y_test, y_pred))

最佳答案

您的模型过度拟合是令人鼓舞的,因为这意味着您的模型具有学习能力。现在你必须逐渐减少模型的容量以使其具有更好的泛化能力。我的建议是添加正则化。

在一些完全连接的层之间添加丢失层:

classifier.add(Dense(units=16, kernel_initializer='uniform', activation='relu', input_dim=11))
classifier.add(keras.layers.Dropout(0.5))
classifier.add(Dense(units=8, kernel_initializer='uniform', activation='relu'))

您可以添加这些 dropout任何层之间都有层,但在具有更多神经元的层之间添加层更好。

如果这不起作用,你可以尝试权重衰减。以下是文档中的示例:

from keras import regularizers
model.add(Dense(64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01)))

尽管首先尝试kernel_regularize 或activity_regularizer。无论如何,它们的工作原理应该是相同的。尝试调整并查看不同参数如何变化。最后,它有很多黑魔法,所以你必须进行一些实验。祝你好运!

关于python - ANN 实现过度拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com