Нейронная сеть для регрессии с tflearn - PullRequest
0 голосов
/ 05 мая 2018

Мой вопрос касается кодирования нейронной сети, которая выполняет регрессию (а НЕ классификацию) с использованием tflearn.

Dataset:

fixed acidity  volatile acidity  citric acid  ...  alcohol  quality   
7.4             0.700            0.00         ...  9.4        5    
7.8             0.880            0.00         ...  9.8        5  
7.8             0.760            0.04         ...  9.8        5     
11.2            0.280            0.56         ...  9.8        6      
7.4             0.700            0.00         ...  9.4        5

Я хочу построить нейронную сеть, которая принимает 11 характеристик (химические значения в вине) и выводит или прогнозирует оценку, то есть качество (из 10). Я не хочу классифицировать вино как quality_1, quality_2, ... Я хочу, чтобы модель выполняла функцию регрессии для моих функций и предсказывала значение из 10 (может быть даже с плавающей точкой).

Столбец качества в моих данных имеет только значения = [3, 4, 5, 6, 7, 8, 9]. Не содержит 1, 2 и 10.

Из-за недостатка опыта я мог кодировать только нейронную сеть, которая классифицирует вино в классы, такие как [Score_3, Score_4, ...], и я использовал для этого одно горячее кодирование.

Обработанные данные:

Особенности:

[[  7.5999999    0.23         0.25999999 ...,   3.02999997   0.44
    9.19999981]
 [  6.9000001    0.23         0.34999999 ...,   2.79999995   0.54000002
   11.        ]
 [  6.69999981   0.17         0.37       ...,   3.25999999   0.60000002
   10.80000019]
 ..., 
 [  6.30000019   0.28         0.47       ...,   3.11999989   0.50999999
    9.5       ]
 [  5.19999981   0.64499998   0.         ...,   3.77999997   0.61000001
   12.5       ]
 [  8.           0.23999999   0.47999999 ...,   3.23000002   0.69999999
   10.        ]]

Ярлыки:

[[ 0.  1.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  1.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  1. ...,  0.  0.  0.]]

Код для нейронной сети, которая классифицирует в различные классы:

import pandas as pd
import numpy as np
import tflearn
from tflearn.layers.core import input_data, fully_connected
from tflearn.layers.estimator import regression
from sklearn.model_selection import train_test_split


def preprocess():

    data_source_red = 'F:\Gautam\...\Datasets\winequality-red.csv'

    data_red = pd.read_csv(data_source_red, index_col=False, sep=';')

    data = pd.get_dummies(data, columns=['quality'], prefix=['score'])

    x = data[data.columns[0:11]].values
    y = data[data.columns[11:18]].values

    x = np.float32(x)
    y = np.float32(y)

    return (x, y)


x, y = preprocess()

train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.2)

network = input_data(shape=[None, 11], name='Input_layer')

network = fully_connected(network, 10, activation='relu', name='Hidden_layer_1')

network = fully_connected(network, 10, activation='relu', name='Hidden_layer_2')

network = fully_connected(network, 7, activation='softmax', name='Output_layer')

network = regression(network, batch_size=2, optimizer='adam', learning_rate=0.01)

model = tflearn.DNN(network)

model.fit(train_x, train_y, show_metric=True, run_id='wine_regression',
          validation_set=0.1, n_epoch=1000)

Нейронная сеть выше плохая (точность = 0,40). Более того, он классифицирует данные на разные классы. Я хотел бы знать, как кодировать нейронную сеть регрессии, которая дает оценку 10 для входных функций (и НЕ КЛАССИФИКАЦИЯ). Я также предпочел бы tflearn, так как я вполне доволен этим.

Надеюсь, несколько изменений в моем коде - это все, что мне нужно. Спасибо.

1 Ответ

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

Это строка в вашем коде, которая делает вашу сеть классификатором с семью категориями вместо регрессора:

network = fully_connected(network, 7, activation='softmax', name='Output_layer')

Я больше не использую TFLearn, я переключился на Keras (который похож и имеет лучшую поддержку). Тем не менее, я предлагаю вам использовать следующий выходной слой:

network = fully_connected(network, 1, activation='linear', name='Output_layer')

Кроме того, ваши тренировочные данные нужно будет изменить. Если вы хотите выполнить регрессию, вам нужна одномерная скалярная метка. Я предполагаю, что у вас все еще есть исходные данные, которые вы говорите, что вы изменили? Если нет, то в хранилище данных машинного обучения UC Irvine имеются данные о качестве вина с одним числовым столбцом качества .

...