Регрессионная модель Keras NN дает низкие потери и 0 точности - PullRequest
0 голосов
/ 02 мая 2018

У меня проблема с этой моделью регрессии NN в кератах. Я работаю над набором данных автомобилей, чтобы предсказать цену, основанную на 13 измерениях. Короче говоря, я прочитал его как pandas dataframe, преобразовал числовые значения в плавающее, масштабировал значения, а затем использовал горячее кодирование для категориальных значений, что создало много новых столбцов, но это меня не особо беспокоит. точка. Меня беспокоит то, что точность практически равна 0%, и я не могу понять, почему. Набор данных можно найти здесь: https://www.kaggle.com/CooperUnion/cardataset/data. Ниже приведен код:

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from keras.utils import to_categorical

# load dataset
# Columns : Make, Model, Year, Engine Fuel Type, Engine HP, Engine Cylinders, Transmission Type, Driven_Wheels, Number of Doors, Vehicle Size, Vehicle Style, highway MPG, city mpg, Popularity, MSRP

import pandas as pd
dataframe = pd.read_csv("cars.csv", header = 'infer', names=['Make', 'Model', 'Year', 'Engine Fuel Type', 'Engine HP', 'Engine Cylinders', 'Transmission Type', 'Driven_Wheels', 'Number of Doors', 'Vehicle Size', 'Vehicle Style', 'highway MPG', 'city mpg', 'Popularity', 'MSRP'])

#convert data columns to float
dataframe[['Engine HP', 'highway MPG', 'city mpg', 'Popularity', 'MSRP']] = dataframe[['Engine HP', 'highway MPG', 'city mpg', 'Popularity', 'MSRP']].apply(pd.to_numeric)

#normalize the values - divide my their max value
dataframe["Engine HP"] = dataframe["Engine HP"] / dataframe["Engine HP"].max()

dataframe["highway MPG"] = dataframe["highway MPG"] / dataframe["highway MPG"].max()

dataframe["city mpg"] = dataframe["city mpg"] / dataframe["city mpg"].max()

dataframe["Popularity"] = dataframe["Popularity"] / dataframe["Popularity"].max()

dataframe["MSRP"] = dataframe["MSRP"] / dataframe["MSRP"].max()

#split input and label
x = dataframe.iloc[:,0:14] 
y = dataframe.iloc[:,14] 

#one-hot encoding for categorical values

def one_hot(df, cols):
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    return df

#columns to transform
cols_to_tran = ['Make', 'Model', 'Year', 'Engine Fuel Type', 'Engine Cylinders', 'Transmission Type', 'Driven_Wheels', 'Number of Doors', 'Vehicle Size', 'Vehicle Style']
d = one_hot(x, cols_to_tran)

list(d.columns.values)

#drop first original 11 columns
e = d.drop(d.columns[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], axis=1)
list(e.columns.values)

#create train and test datasets - 80% for train and 20% for validation
t = len(e)*0.8
t = int(t)

train_data = e[0:t]
train_targets = y[0:t]

test_data = e[t:]
test_targets = y[t:]


#convert to numpy array
train_data = train_data.values
train_targets = train_targets.values

test_data = test_data.values
test_targets = test_targets.values


# Sample Multilayer Perceptron Neural Network in Keras
from keras.models import Sequential
from keras.layers import Dense
import numpy

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(train_data.shape[1],)))
model.add(Dense(32, activation='relu'))
#model.add(Dense(1, activation='sigmoid'))
model.add(Dense(1))

# 2. compile the network
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 3. fit the network
history = model.fit(train_data, train_targets, epochs=100, batch_size=50)

# 4. evaluate the network
loss, accuracy = model.evaluate(test_data, test_targets)
print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))

# 5. make predictions
probabilities = model.predict(test_data)
predictions = [float(x) for x in probabilities]
accuracy = numpy.mean(predictions == test_targets)
print("Prediction Accuracy: %.2f%%" % (accuracy*100))

И результат в соответствии с ниже:

enter image description here

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Прежде всего, вы должны подумать о чистоте своего кода при публикации вопросов в stackoverflow. Я пытался повторить ваш код и обнаружил некоторые ошибки, прежде чем очистить ваш набор данных в массивных массивах train_data, train_targets, test_data и test_targets.

Сосредоточив внимание на теории машинного обучения, если вы не перетасуете свой набор данных, вашей регрессионной модели будет действительно сложнее пройти обучение. Попробуйте перетасовать ваш набор данных, используя random.shuffle(), прежде чем разделять поезд и тестовые подмножества.

Как указывает ответ Матиаса , если вы работаете над регрессионной задачей (вместо классификации), нет смысла использовать метрику точности.

Кроме того, потеря бинарной кроссентропии также подходит только для классификации, поэтому она не имеет смысла. Типичные потери, используемые для регрессионных моделей, составляют Среднеквадратичная ошибка . Подумайте о том, чтобы изменить компиляцию вашей модели keras:

model.compile(loss='mean_squared_error', optimizer='adam')

Надеюсь, это поможет!

0 голосов
/ 02 мая 2018

Точность является классификационной метрикой, нет смысла использовать ее для регрессии. Там нет реальной проблемы.

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