【问题标题】:Multiple linear regression with gradient descent梯度下降的多元线性回归
【发布时间】:2019-10-09 14:38:21
【问题描述】:

晕,

我是机器学习和 Python 方面的新手,我想用我的梯度下降来预测Kaggle House Sales in King County dataset

我将 70%(15k 行)的训练和 30%(6k 行)的测试分开,我从 19 个特征中选择了 5 个特征,但是存在性能问题,算法花费了很多时间(超过 11 小时), 100% 内存,执行失败。

这是我的梯度下降课程:

class GradientDescent:

    X_train = []
    Y_train = []
    X_test  = []
    Y_test  = []
    lr = 0
    max_iter = 0
    theta = 0

    def __init__(self, X_train,Y_train,X_test,Y_test, lr=0.01, max_iter=100):
        self.X_train = X_train
        self.Y_train = Y_train
        self.X_test  = X_test
        self.Y_test  = Y_test
        self.lr = lr
        self.max_iter = max_iter
        self.theta = np.random.randn(X_train.shape[1], 1)
        print(self.theta)

    def costFunction(self,theta,X,y):
        "1/2m * E(h0-y)**2"
        m = len(y)
        y_pred = X.dot(theta)
        cost = (1/2*m) * np.sum(np.square(y_pred-y))

        return cost


    def estimate(self):
        m = len(self.Y_train)

        mse_hist = np.zeros(self.max_iter)

        #theta_hist = np.zeros(max_iter)
        i = 0
        while i < self.max_iter or mse_hist[i] > 0.01:
            y_pred = np.dot(self.X_train,self.theta)

            error = y_pred-self.Y_train
            self.theta = self.theta - (1/m)*self.lr*(self.X_train.T.dot((error)))
            mse_hist[i] = self.costFunction(self.theta,self.X_train, self.Y_train)

            #print(mse_hist[i])
            i+=1            
        return (self.theta, mse_hist)


    def test(self):
        res = pd.DataFrame()
        for i,row in self.X_test.iterrows():
            price_pred = np.dot(row.values,self.theta)
            res = row
            res['price_actual'] = self.Y_test[i]
            res['price_predict'] = price_pred

        res['r2_score'] = r2_score(res['price_actual'].values, res['price_predict'])
        res.to_csv('output.csv')

有什么建议可以让它变得更好吗?

【问题讨论】:

    标签: python machine-learning regression gradient-descent


    【解决方案1】:

    一般来说,虽然我没有测试过,但代码看起来还不错。我能找到的唯一错误是你可能没有在你的while循环中增加i,所以循环永远不会退出。

    【讨论】:

    • 哦,我忘了在我的问题中添加它,但在我的代码中,增量是可用的
    • 这个类本身看起来还不错,15k 行是相当合理的,一台体面的计算机不应该使用 100% 的内存或运行多个小时进行 100 次迭代。可能在调用此类的代码中发生了一些事情。顺便说一句,由于行数或特征数较多,训练变得昂贵,随机梯度下降开始成为一种计算效率更高的解决方案,因此您也可以研究一下。
    • 问题解决了,GD 适合小数据集,我尝试过 mini batch GD,它更快,也足够用于学习目的
    • 你是怎么解决这个问题的,mini batch GD有帮助吗?
    • 是的,我不知道我猜原始 GD 的问题是我的矩阵计算来寻找 theta,15000 行乘法同时使内存耗尽,所以使用小批量我们只计算批量大小跨度>
    猜你喜欢
    • 2017-06-20
    • 2017-01-02
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多