机器学习(五)——缓解过拟合
生活随笔
收集整理的這篇文章主要介紹了
机器学习(五)——缓解过拟合
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看圖理解過擬合與欠擬合
欠擬合解決方法
-
增加輸入特征項
-
增加網(wǎng)絡參數(shù)
-
減少正則化參數(shù)
過擬合解決方法
-
數(shù)據(jù)清洗
-
增大訓練集
-
采用正則化
-
增大正則化參數(shù)
案例
import tensorflow as tf from matplotlib import pyplot as plt import numpy as np import pandas as pd ###正則化緩解過擬合 # 正則化在損失函數(shù)中引入模型復雜度指標,利用給W加權值,弱化訓練數(shù)據(jù)的噪聲(一般不正則化b)# 正則化的選擇 # L1正則化大概率會使很多參數(shù)變?yōu)?,因此該方法可通過稀疏參數(shù),即加少參數(shù)的數(shù)量,降低復雜度 # L2正則化會使參數(shù)很接近0但不為0,因此該方法可通過減小參數(shù)值的大小降低復雜度###讀入數(shù)據(jù) df = pd.read_csv("dot.csv") x_data = np.array(df[['x1', 'x2']]) y_data = np.array(df['y_c'])##-1的意思是行數(shù)自動生成 x_train = np.vstack(x_data).reshape(-1, 2) y_train = np.vstack(y_data).reshape(-1, 1)Y_c = [['red' if y else 'blue'] for y in y_train]##轉換數(shù)據(jù)類型。不然后面矩陣相乘會報錯 x_train = tf.cast(x_train, dtype=tf.float32) y_train = tf.cast(y_train, dtype=tf.float32)#from_tensor_slices函數(shù)切分傳入的張量的第一個維度,生成相應的數(shù)據(jù)集,輸入特征與標簽一一對應 train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)###這里定義了兩層網(wǎng)絡 #生成升神經(jīng)網(wǎng)絡參數(shù),輸入層為2個神經(jīng)元(因為兩個特征),隱藏層為11個神經(jīng)元(這個自己選),1層為隱藏層,輸出層為1個神經(jīng)元 #用tf.Variable()保證參數(shù)可訓練 w1 = tf.Variable(tf.random.normal([2,11]), dtype=tf.float32) b1 = tf.Variable(tf.constant(0.01, shape=[11])) ##第二層,輸出節(jié)點必須和標簽個數(shù)一樣所以是1,神經(jīng)元個數(shù)要和前面的保持一致所以是[11,1] w2 = tf.Variable(tf.random.normal([11,1]), dtype=tf.float32) b2 = tf.Variable(tf.constant(0.01, shape=[1]))lr = 0.005#學習率 epoch = 800#循環(huán)輪數(shù)#訓練部分 for epoch in range(epoch):for step, (x_train, y_train) in enumerate(train_db):with tf.GradientTape() as tape:h1 = tf.matmul(x_train, w1) + b1##relu激活函數(shù)h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2#采用均方誤差損失函數(shù)mse = mean(sum(y-out)^2)loss_mse = tf.reduce_mean(tf.square(y_train - y))###添加l2正則化緩解過擬合#####################################loss_regularization = []loss_regularization.append(tf.nn.l2_loss(w1))loss_regularization.append(tf.nn.l2_loss(w2))loss_regularization = tf.reduce_sum(loss_regularization)loss = loss_mse + 0.03 * loss_regularization##########################################################計算loss對各個參數(shù)的梯度variables = [w1, b1, w2, b2]grads = tape.gradient(loss, variables)#開始梯度更新#w1 = w1 -lr * w1_grad tape.gradient是自動求導結果與[w1, b1, w2, b2] 索引為0 1 2 3w1.assign_sub(lr * grads[0])b1.assign_sub(lr * grads[1])w2.assign_sub(lr * grads[2])b2.assign_sub(lr * grads[3])##每20個epoch 打印一下lossif epoch % 20 == 0:print('epoch:', epoch, 'loss', float(loss))##預測部分 print("*******predict********") xx, yy = np.mgrid[-3:3:.1, -3:3:.1] # 將xx,yy拉直,并合并配對為二維張量,生成二維坐標點 grid = np.c_[xx.ravel(), yy.ravel()] grid = tf.cast(grid, tf.float32) #將網(wǎng)格坐標放入神經(jīng)網(wǎng)絡,進行預測,probs為輸出 probs = [] for x_test in grid:#使用訓練好的參數(shù)w1, b1, w2, b2進行預測h1 = tf.matmul([x_test], w1) + b1h1 = tf.nn.relu(h1)y = tf.matmul(h1, w2) + b2#預測結果probs.append(y) #取第0列給x1,取第1列給x2 x1 = x_data[:, 0] x2 = x_data[:, 1] #probs的shape調整成xx的樣子 probs = np.array(probs).reshape(xx.shape) plt.scatter(x1, x2, color = np.squeeze(Y_c))#squeeze去掉維度是1的維度 # 把坐標xx yy和對應的值probs放入contour函數(shù),給probs值0.5的所有點上色 plt.contour(xx, yy, probs, levels=[.5]) plt.show() #讀入紅藍點,畫出分隔線,不包含正則化未正則化的結果(邊界不夠圓滑)
?
正則化后的結果?
總結
以上是生活随笔為你收集整理的机器学习(五)——缓解过拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习(四)——损失函数
- 下一篇: 机器学习(六)——优化器