嶺回歸可以看作是線性回歸的一種增強版,實現的時候無非就是加入乙個二範數正則化項,但是應當注意,這裡只對於權重進行懲罰,偏置項是不加入正則化的,具體理論可以參見相關的**和blog,在此不贅述。
這裡還是使用tf實現了嶺回歸演算法,並實際應用在了乙個真實資料集而非人工資料集上,資料及規模相比於之前的資料也大了很多。
本次**從資料讀入,到建立計算圖,到模型訓練、模型評估,實際上是對前面幾篇部落格的小總結,至此,一般情況下的資料訓練問題都可以套用這個模板來寫。
我所使用的資料格式為最後一列是label,其餘列是特徵,label是二類,分別用1,-1表示。
目前版本只有嶺回歸,之後會加入logstic回歸已經tensorboard顯示的功能。
import tensorflow as tf
import numpy as np
import pandas as pd
train = pd.read_csv("./data/dataset1-a9a-training.txt", encoding="utf-8")
print(train.describe())
columnnum = train.values.shape[1] # 獲取資料的列數,其中最後一列是label
# 使用pandas獲取全部資料,評估效果用
defgetall
(filename):
data = pd.read_csv(filename, dtype=np.float32)
example = data.values[:,:-1]
label = data.values[:,-1]
return example, label
# tf獲取資料
defread_data
(filenamequeue):
reader = tf.textlinereader()
key, value = reader.read(filenamequeue)
recorddefaults =
for i in range(columnnum):
col = tf.decode_csv(value, record_defaults=recorddefaults)
features = tf.squeeze(tf.reshape(tf.stack([col[:-1]]), [columnnum-1, 1]), squeeze_dims=1) # 統一格式為[n_samples,1]
label = col[-1]
return features, label
# tf分批資料
definput_batch
(filename, batchsize, dequeue = 10000):
filenameque = tf.train.string_input_producer([filename], shuffle=true)
example, label = read_data(filenameque)
min_after_dequeue = dequeue # 樣本池調整的大一些隨機效果好
capacity = min_after_dequeue + 3 * batchsize
examplebatch, labelbatch = tf.train.shuffle_batch([example, label], batch_size=batchsize, capacity=capacity,
min_after_dequeue=min_after_dequeue)
return examplebatch, labelbatch
# 嶺回歸計算圖
defridge_regression
(examplebatch, labelbatch, lamda = 0.5, alpha = 0.1):
with tf.name_scope("ridge"):
w = tf.variable(tf.random_normal([columnnum-1, 1]), name="w")
b = tf.variable(tf.random_normal([1]), name="b")
logits = tf.matmul(examplebatch, w)+b
loss = tf.reduce_mean(tf.square(labelbatch-logits)) + lamda*tf.norm(w)
train = tf.train.gradientdescentoptimizer(alpha).minimize(loss)
return train, loss, w, b
# 評價函式,計算準確率
defevaluate
(w, b, testdata, testlabel):
testexample = tf.variable(testdata, trainable=false)
tflabel = tf.variable(testlabel, trainable=false)
tflabel = tf.equal(tflabel, 1)
tflabel = tf.reshape(tflabel, [-1, 1])
pred = tf.matmul(testexample, w)+b
res = tf.equal(tf.greater(pred, 0.0), tflabel) # 以0為分界點分類
acc = tf.reduce_mean((tf.cast(res, dtype=tf.float32))) # 轉換成浮點型,整型計算會一直結果為0
return acc
if __name__ == "__main__":
examplebatch, labelbatch = input_batch("./data/dataset1-a9a-training.txt", batchsize=100)
train, loss, w, b = ridge_regression(examplebatch, labelbatch)
testdata, testlabel = getall("./data/dataset1-a9a-training.txt")
acc = evaluate(w, b, testdata, testlabel)
maxiter = 1000
# 最大迭代次數
with tf.session() as sess:
init = tf.global_variables_initializer() # 初始化放在計算圖後
sess.run(init)
coord = tf.train.coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(maxiter):
#example, label = sess.run([examplebatch, labelbatch])
#print(example.shape)
#print(label)
_, lossarr, accarr = sess.run([train, loss, acc])
print(lossarr, accarr)
#print(logits)
coord.request_stop()
coord.join(threads)
嶺回歸 lasso回歸
嶺回歸 ridge regression 和lasso least absolute shrinkage and selection operator 都是ols的改進,知乎上有關於三者異同的詳細討論 關於lasso 這裡記錄一下最近的學習心得。嶺回歸的含義 嶺回歸的權值計算公式中有單位方陣i,就像...
機器學習 嶺回歸和 LASSO 回歸實現
普通最小二乘法帶來的侷限性,導致許多時候都不能直接使用其進行線性回歸擬合。特別是以下兩種情況 為了解決上述兩種情況 現的問題,嶺回歸 ridge regression 應運而生。嶺回歸可以被看作為一種改良後的最小二乘估計法,它通過向損失函式中新增l2l2 l2正則項 2 範數 有效防止模型出現過擬合...
核心嶺回歸
kernel ridge regression krr 核心嶺回歸 它所學習到的在空間中不同的線性函式是由不同的核心和資料所導致的。對於非線性的核心,它與原始空間中的非線性函式相對應。由kernelridge學習的模型的形式與支援向量回歸 svr 是一樣的。但是他們使用不同的損失函式 核心嶺回歸 k...