【我的TensorFlow之路·3】迴歸度量與糖尿病預測
阿新 • • 發佈:2019-01-01
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 係數
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()