Scientific Python中的损失优化
在机器学习中经常发生数据训练以找到优化参数的过程。当您使用标准损失函数(如MRSE)时,很容易找到标准软件包来训练您的模型。但是,在实现(或编写)新算法时,您可能必须自己处理自己的损失函数。
Scientific Python在scipy.optimize包中提供了许多优化例程。在本文中,我们将实现其中两个例程。我们将利用Kaggle提供的Boston Housing Prediction数据(https://www.kaggle.com/c/boston-housing)。让我们从导入所需的包开始。
import pandas as pd
import numpy as np
from scipy.optimize import fmin, minimize
让我们获取,加载和提取我们的numpy数组
train_df = pd.read_csv('./train.csv', index_col='ID')
y = train_df['medv'].values
y = y.reshape(-1, 1)
train_df['constant'] = 1
columns = ['constant', 'crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'black', 'lstat']
x = train_df[columns].values
我们将实现简单线性回归Y = WX,我们实例化一个初始值为0的数组w。我们需要注意我们的维度,因此我们的维度没有静态值。
w = np.zeros([x.shape [1],1])
接下来,让我们创建线性回归函数。
def pred(x,w):
return np.dot(x,w)
然后我们可以通过调用此函数来进行预测。
y_pred = pred(x,w)
为了训练我们的模型并优化w,我们需要一个损失函数。让我们来定义下一个
def loss(_w):
p = pred(x, _w)
e = y - p
se = np.power(e, 2)
rse = np.sqrt(np.sum(se))
rmse = rse / y.shape[0]
return rmse
FMIN
我们将使用的第一个优化例程是fmin。这使用Nelder-Mead单纯形算法来查找函数的最小值。它不要求函数是可微的。然而,它不能很好地推广到高维数据。我们来试试吧。我们需要指定迭代次数,以便此算法可以找到好的值。没有它,您的数据可能会提供默认的步骤数
min = fmin(loss, w, maxiter=1000)
函数调用返回w的优化值。然后,我们可以将新的预测值与最初的预测值进行比较
y_min = pred(x, min)
out = pd.DataFrame({'y': y[:,0], 'y_pred': y_pred[:,0], 'y_min': pred(x, min)})
out.head(n=15)
minimize
当处理具有一阶或二阶导数的高维数据或损失函数时,我们可以使用minimize()。
让我们从实现与fmin()相同的解决方案开始。
nms = minimize(loss, w, method='nelder-mead')
您可能会注意到的第一件事是我们现在有一个方法参数。我们指定'nelder-mead'。其次,我们现在在对minimize()的调用结果中有更多数据。在这种情况下,我们对x参数感兴趣。让我们继续进行预测。
out_2 = pd.DataFrame({'y':y [:,0],'y_pred':y_pred [:,0],'y_min':pred(x,nms.x)})
out_2.head()
可以定义另一个函数,它是损失的导数,然后在调用中使用它最小化()。