【问题标题】:Neural Network for Regression with tflearn使用 tflearn 进行回归的神经网络
【发布时间】:2018-10-15 21:17:33
【问题描述】:

我的问题是关于使用 tflearn 编写一个进行回归(而不是分类)的神经网络。

数据集:

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,因为我对它很满意。

希望我只需要对我的代码进行一些更改。谢谢。

【问题讨论】:

    标签: machine-learning neural-network classification regression tflearn


    【解决方案1】:

    这是您的代码中的一行代码,它使您的网络成为具有七个类别的分类器,而不是回归器:

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

    我不再使用 TFLearn,我已经切换到 Keras(类似,并且有更好的支持)。但是,我建议您改用以下输出层:

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

    此外,您的训练数据也需要更改。如果要执行回归,则需要一维标量标签。我假设你仍然有原始数据,你说你改变了?如果没有,the UC Irvine Machine Learning Data Repository has the wine quality data with a single, numerical Quality column

    【讨论】:

    • 我删除了 pd.get_dummies 这使得 OneHotCoding。所以,现在我拥有了原来的数据集。我将y = data[data.columns[11:18]].values 更改为y = data[data.columns[11]].values,所以现在我的标签数据为:[ 5. 5. 5. ..., 6. 5. 6.] 我将输出层更改为您所建议的。但现在我得到一个值错误。错误:ValueError: Cannot feed value of shape (2,) for Tensor 'TargetsData/Y:0', which has shape '(?, 1)'
    • 我认为shape (2,) 问题与您选择批量大小为 2 的事实有关。您可以通过尝试不同的批量大小来确认这一点。我还认为解决它的方法是将单个输出列包装在一个额外的维度中。在 preprocess() 中创建 y 后,尝试 y = np.expand_dims(y,-1)。 (我发现 Keras 可以更自动地处理这种事情。)
    • 是的,shape(2, ) 是因为我的批处理大小是 2。我通过更改批处理大小来检查它。应用此代码后:y = np.expand_dims(, -1) 我的模型工作正常。我什至预测了 10 分中的分数。非常感谢。还有一个问题,在运行代码时我得到了loss = 0.00binary_accuracy = 0.00 但是在使用print(model.evaluate(test_x, test_y)) 评估我的模型时,我得到的输出为 [0.93...] 这是否意味着我的模型在测试数据中的准确率为 93%?
    • 我将这一行:network = regression(network, batch_size=2, optimizer='adam', learning_rate=0.01) 更改为 network = regression(network, batch_size=1, optimizer='adam', learning_rate=0.01, loss='mean_square', metric='R2') 现在在训练模型时,我得到了损失和 R2 值。 R2是什么,它的理想值应该是多少?有时,R2 会射出超过 1.0,例如 1.023。什么是 R2,它与准确度有何不同?再次感谢!
    猜你喜欢
    • 2013-05-28
    • 2016-06-15
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2017-09-16
    • 2012-10-26
    相关资源
    最近更新 更多