ANN Осуществление переоснащения - PullRequest
0 голосов
/ 12 мая 2019

Я новичок в области 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))

1 Ответ

1 голос
/ 12 мая 2019

То, что ваша модель переоснащается, обнадеживает, потому что это означает, что ваша модель способна учиться.Теперь вам нужно постепенно уменьшать возможности вашей модели, чтобы она лучше обобщалась.Я рекомендую добавить регуляризацию.

Добавить выпадающие слои между некоторыми из ваших полностью подключенных слоев:

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'))

Вы можете добавить эти выпадающие слои между любыми слоями, нолучше добавлять между слоями больше нейронов.

Если это не сработает, вы можете попробовать снижение веса.Вот пример из документации:

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.Они оба должны работать примерно одинаково.Попробуйте настроить и посмотреть, как изменяются различные параметры.В конце концов, это много черной магии, так что вам придется немного поэкспериментировать.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...