我在使用这个链接提供的数据集进行价格预测工作,数据集为imports-85.data
。
使用horsepower
(马力)、curb-weight
(整备质量)、engine-size
(发动机尺寸)和highway-mpg
(高速公路燃油效率)这些特征,我尝试进行了归一化处理(由于成本过高),并通过实现以下内容运行了梯度下降算法:
初始化
data = df[attrs]m = len(data) # m-training examplesf = len(attrs) # n-featuresX = np.hstack((np.ones(shape=(m,1)),np.array(data)))T = np.zeros(f + 1) # Coefficients of x(0),x(1),...x(n)norm_price = df.price / 1000Y = np.array(norm_price)# Normalizationdata['curb-weight'] = (data['curb-weight'] * 0.453592) / 1000 # To kg (e-1000)data['highway-mpg'] = data['highway-mpg'] * 0.425144 # To km per litre (kml)data['engine-size'] = data['engine-size'] / 100 # To e-100data['horsepower'] = data['horsepower'] / 100 # To e-100col_rename = { 'curb-weight':'curb-weight-kg(e-1000)', 'highway-mpg':'highway-kml', 'engine-size':'engine-size(e-100)', 'horsepower':'horsepower(e-100)'}data.rename(columns=col_rename,inplace=True)
成本计算
def calculateCost(): global m,T,X hypot = (X.dot(T) - Y).transpose().dot(X.dot(T) - Y) return hypot / (2 * m)
梯度下降
def gradDescent(threshold,iter = 10000,alpha = 3e-8): global T,X,Y,m i = 0 cost = calculateCost() cost_hist = [cost] while i < iter: T = T - (alpha / m) * X.transpose().dot(X.dot(T) - Y) cost = calculateCost() cost_hist.append(cost) i += 1 if cost <= threshold: return cost_hist
我使用这个实现运行了梯度下降:批量梯度下降
在未进行归一化的情况下,成本将是118634960.460199
。在进行了归一化处理后,成本将是118.634960460199
因此,我有几个问题:
- 我的归一化技术是否正确?
- 归一化后成本会有所不同。我应该如何设定归一化后的成本阈值?
回答:
我认为你可能误解了机器学习背景下的“归一化”。根据我对你代码的解读,你的“归一化”部分实际上是在进行单位转换。在梯度下降之前,通常会应用最大-最小缩放或标准缩放,参见scikit-learn用户指南。这些技术可以创建具有一致缩放范围的特征,这样单个特征的变化就不会完全主导损失函数。这个问题和这篇博客文章有更详细的讨论。