1. 程式人生 > >【我的TensorFlow之路·3】迴歸度量與糖尿病預測

【我的TensorFlow之路·3】迴歸度量與糖尿病預測

1 迴歸度量

       繼房價預測後,匯入糖尿病資料集diabetes進行迴歸預測。這次觀察的超引數除了stddev和lr外還觀察了隱藏層神經元個數的影響,並應魏聰明的要求加入了公式化的評價指標,主要使用sklearn.metrics庫裡的迴歸度量函式。sklearn.metrics裡共有5個迴歸度量函式,以下為各個迴歸度量的維基百科解釋和sklearn中英文官方文件截圖:

1.1 解釋方差分數(explained_variance_score)

1.2 平均絕對誤差(mean_absolute_error)

1.3 均方誤差(mean_squared_error)

1.4 中間絕對誤差(median_absolute_error)

1.5 R^{2}係數

2 糖尿病預測

仍然使用sklearn裡自帶的資料集,訓練diabetes這個資料集的目標是預測一年後患糖尿病的可能性。資料集如下(共10個特徵,442條資料):

程式碼如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 29 16:40:57 2018

@author: Zheng
"""
#這次要對神經元個數進行觀察,繼續觀察stddev和lr,同時加入公式化評價指標
import tensorflow as tf
from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler

#diabetes=load_diabetes()

w1 = tf.Variable(tf.random_normal(shape=[10,2],stddev=0.1,dtype=tf.float64))
b1 = tf.Variable(tf.constant(value=0.0,shape=[2,],dtype=tf.float64))
w2 = tf.Variable(tf.random_normal(shape=[2,1],stddev=0.1,dtype=tf.float64))
b2 = tf.Variable(tf.constant(value=0.0,shape=[1,],dtype=tf.float64))

def inference(X):
    a = tf.nn.relu(tf.matmul(X,w1)+b1)
    return tf.matmul(a,w2)+b2

def loss(X,Y):
    Y_predict = inference(X)
    total_loss = tf.reduce_mean(tf.squared_difference(Y,Y_predict))
    return Y_predict,total_loss

def inputs():
    diabetes = load_diabetes()
    MinMax = MinMaxScaler()
    X = MinMax.fit_transform(diabetes.data)
    target = diabetes.target.reshape(-1,1)
    Y = MinMax.fit_transform(target)
    return X,Y

def train(total_loss):
    lr = 0.1
    return tf.train.GradientDescentOptimizer(lr).minimize(total_loss)
    
def evaluate(Y,Y_p):
    print("解釋方差分數:",metrics.explained_variance_score(Y,Y_p))
    print("平均絕對誤差:",metrics.mean_absolute_error(Y,Y_p))
    print("均方誤差:",metrics.mean_squared_error(Y,Y_p))
    print("中間絕對誤差:",metrics.median_absolute_error(Y,Y_p))
    print("R2分數:",metrics.r2_score(Y,Y_p))
    
def plot_fun(Y,Y_p):
    plt.figure()
    plt.plot(Y,'bo',alpha=0.5)
    plt.plot(Y_p,'ro',alpha=0.5)
    plt.ylabel('progression')
    plt.show()
    
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    
    X,Y = inputs()
    Y_predict,total_loss = loss(X,Y)
    train_op = train(total_loss)
    
    training_steps = 1000
    for i in range(training_steps):
        sess.run(train_op)
        if i % 10 == 0:
            print("loss:",sess.run(total_loss))
            
    Y_p = sess.run(Y_predict)
    plot_fun(Y,Y_p)
    evaluate(Y,Y_p)
    
    sess.close()

資料集原分佈如下:

實驗結果如下:

(1)隱藏層神經元個數為2:

①stddev=0.1,lr=0.1

②stddev=0.1,lr=0.01

③stddev=0.01,lr=0.1

④stddev=0.01,lr=0.01

(2)隱藏層神經元個數為3:

①stddev=0.1,lr=0.1

②stddev=0.01,lr=0.1

(3)隱藏層神經元個數為4:

①stddev=0.1,lr=0.1

②stddev=0.01,lr=0.1

(4)隱藏層神經元個數為5:

①stddev=0.1,lr=0.1

②stddev=0.01,lr=0.1

        大概資料量太小了,所以發現隱藏層神經元個數對網路效能影響不大[手動捂臉],煞費苦心的跑了這麼多次,還一張一張截圖,真是$%#%$#
[email protected]
……,但是另外兩個超引數stddev為0.1或0.01,lr為0.1時效果最好。