Scientific Python中的损失优化

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()

可以定义另一个函数,它是损失的导数,然后在调用中使用它最小化()。

相关推荐