Machine learning 基于tflearn的回归神经网络
我的问题是关于编码一个使用tflearn进行回归(而不是分类)的神经网络 数据集:Machine learning 基于tflearn的回归神经网络,machine-learning,neural-network,classification,regression,tflearn,Machine Learning,Neural Network,Classification,Regression,Tflearn,我的问题是关于编码一个使用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
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分)。我不想把葡萄酒分为质量1、质量2,。。。我希望模型对我的特征执行回归函数,并预测10个值中的一个(甚至可能是一个浮点值)
我的数据中的quality列只有值=[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分。我也更喜欢学习,因为我对它很满意
希望对我的代码进行一些修改就是我所需要的。谢谢。这是您代码中的一行代码,它使您的网络成为具有七个类别的分类器,而不是回归器:
network = fully_connected(network, 7, activation='softmax', name='Output_layer')
我不再使用TFLearn了,我已经切换到Keras(它与Keras类似,并且有更好的支持)。但是,我建议您使用以下输出层:
network = fully_connected(network, 1, activation='linear', name='Output_layer')
此外,您的培训数据也需要更改。如果要执行回归,则需要一维标量标签。我假设你仍然拥有原始数据,你说你改变了这些数据?如果没有,则.我删除了
pd.get\u dummies
,这使OneHotCoding成为可能。所以,现在我有了数据集。我将y=data[data.columns[11:18]].values
更改为y=data[data.columns[11].values
因此现在我的标签数据为:[5.5.5….,6.5.6]
我将输出层更改为您建议的。但现在我得到一个值错误。错误:value错误:无法为张量'TargetsData/Y:0'输入形状(2,)的值,该张量具有形状'(?,1)
我认为shape(2,)
问题与您选择的批次大小为2有关。您可以通过尝试不同的批量大小来确认这一点。我还认为解决这个问题的方法是将单个输出列包装在一个额外的维度中。在preprocess()
中创建y后,请尝试y=np。展开(y,-1)
。(我发现Keras可以更自动地处理这类事情。)是的,shape(2,)
是因为我的批量大小是2。我通过改变批量大小来检查它。应用此代码后:y=np.expand_dims(,-1)
我的模型运行良好。我甚至预测了10分中的分数。谢谢。还有一个问题,在运行代码时,我得到了loss=0.00
和binary\u-accurity=0.00
,但在使用print(model.evaluate(test\u x,test\u y))评估我的模型时,
我得到了[0.93…]的输出,这是否意味着我的模型在测试数据中得到了93%的准确性?我更改了这一行:network=regression(网络,批量大小=2,优化器='adam',学习率=0.01)
到网络=回归(网络,批量大小=1,优化器='adam',学习率=0.01,损失='均方',度量='R2')
现在,在训练模型时,我得到了损耗和R2值。R2是什么,它的理想值应该是什么?有时,R2的射程超过1.0,比如1.023。R2是什么,它与精度有什么区别?再次感谢!