在構建模型時,您經常會發現自己在高偏差(低方差)模型和高偏差(低偏差)模型之間徘徊。
高偏差模型是一個永遠不需要的模型,因為它過於簡單,無法在一般情況下使用。另一方面,高方差模型可以逐漸簡化以滿足您的需求。簡化問題稱為正則化。
在這篇文章中,我們將過度設計我們的模型,結果導致它過度擬合。然後應用正則化來減小方差。
我們將使用Kaggle上託管的Boston Housing Price預測數據(https://www.kaggle.com/c/boston-housing)。
讓我們首先導入我們的數據並將其拆分為我們的特徵和標籤。然後,我們將繼續設計新特徵。在這種情況下,我們將每列的平方作為新列添加。在實踐中,你可以做更多的事情,比如乘法特徵,取對數或使用正弦函數。
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
#load training data
train_df = pd.read_csv('train.csv', index_col='ID')
#split into features and target
X = train_df.drop('medv', axis=1)
y = train_df['medv']
#engineer new features
X['crim_2'] = X['crim'] ** 2
X['zn_2'] = X['zn'] ** 2
X['indus_2'] = X['indus'] ** 2
X['chas_2'] = X['chas'] ** 2
X['nox_2'] = X['nox'] ** 2
X['rm_2'] = X['rm'] ** 2
X['age_2'] = X['age'] ** 2
X['dis_2'] = X['dis'] ** 2
X['rad_2'] = X['rad'] ** 2
X['tax_2'] = X['tax'] ** 2
X['ptratio_2'] = X['ptratio'] ** 2
X['black_2'] = X['black'] ** 2
X['lstat_2'] = X['lstat'] ** 2
#split into training and validation
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.3)
接下來,我們定義輸入函數。我們需要這個來將數據傳輸到我們的估算器中。在這個版本中,我們將使用一個輸入函數進行訓練和測試,方法是將數據作為參數傳遞。Python代碼如下:
def input_fn(X, y, batch_size=16, epochs=1, shuffle=False):
#create a dictionary of features and their values
features = {key:np.array(value) for key,value in dict(X).items()}
#create a tf.data compliant dataset
d = tf.data.Dataset.from_tensor_slices((features, y))
#we need our data in batches
d = d.batch(batch_size).repeat(epochs)
#optionally shuffle our data
if shuffle:
d.shuffle(10000)
#make an iterator
iterator = d.make_one_shot_iterator()
return iterator.get_next()
接下來,讓我們檢查我們的特徵,並將列名稱提取到特徵列中。
X.info()
feature_columns = [
tf.feature_column.numeric_column('crim', dtype=tf.float64),
tf.feature_column.numeric_column('zn', dtype=tf.float64),
tf.feature_column.numeric_column('indus', dtype=tf.float64),
tf.feature_column.numeric_column('chas', dtype=tf.int64),
tf.feature_column.numeric_column('nox', dtype=tf.float64),
tf.feature_column.numeric_column('rm', dtype=tf.float64),
tf.feature_column.numeric_column('age', dtype=tf.float64),
tf.feature_column.numeric_column('dis', dtype=tf.float64),
tf.feature_column.numeric_column('rad', dtype=tf.int64),
tf.feature_column.numeric_column('tax', dtype=tf.int64),
tf.feature_column.numeric_column('ptratio', dtype=tf.float64),
tf.feature_column.numeric_column('black', dtype=tf.float64),
tf.feature_column.numeric_column('lstat', dtype=tf.float64),
tf.feature_column.numeric_column('crim_2', dtype=tf.float64),
tf.feature_column.numeric_column('zn_2', dtype=tf.float64),
tf.feature_column.numeric_column('indus_2', dtype=tf.float64),
tf.feature_column.numeric_column('chas_2', dtype=tf.int64),
tf.feature_column.numeric_column('nox_2', dtype=tf.float64),
tf.feature_column.numeric_column('rm_2', dtype=tf.float64),
tf.feature_column.numeric_column('age_2', dtype=tf.float64),
tf.feature_column.numeric_column('dis_2', dtype=tf.float64),
tf.feature_column.numeric_column('rad_2', dtype=tf.int64),
tf.feature_column.numeric_column('tax_2', dtype=tf.int64),
tf.feature_column.numeric_column('ptratio_2', dtype=tf.float64),
tf.feature_column.numeric_column('black_2', dtype=tf.float64),
tf.feature_column.numeric_column('lstat_2', dtype=tf.float64)
]
正則化在訓練中被應用,所以我們將使用一個優化器,讓我們使用應用正則化。我們還將指定學習率。您可以使用各種超參數來查看它們如何影響模型的質量。
optimizer = tf.train.FtrlOptimizer(learning_rate=0.01, l1_regularization_strength=0.1)
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns, optimizer=optimizer)
estimator.train(input_fn= lambda: input_fn(X_train, y_train), steps=20)
繼續評估您的模型
evaluate_result = estimator.evaluate(input_fn=lambda: input_fn(X_train, y_train))
print("Training results")
for key in evaluate_result:
print(" {}, was: {}".format(key, evaluate_result[key]))
evaluate_result = estimator.evaluate(input_fn=lambda: input_fn(X_test, y_test))
print("Training results")
for key in evaluate_result:
print(" {}, was: {}".format(key, evaluate_result[key]))
您可以繼續進行預測
preds = estimator.predict(input_fn=lambda: input_fn(X_test, y_test))
predictions = np.array([item['predictions'][0] for item in preds])
閱讀更多 不靠譜的貓 的文章