博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bobo老师机器学习笔记第五课-多元线性回归
阅读量:4170 次
发布时间:2019-05-26

本文共 4177 字,大约阅读时间需要 13 分钟。

思维导图学习笔记

自己参考BoBo老师课程讲解实现:

# -*- coding: utf-8 -*-import numpy as npfrom metrics import r2_scoreclass LinearRegression(object):    def __int__(self):        self.coef_ = None  # 表示系数        self.intercept_ = None  # 表示截距        self._theta = None  # 过程计算值,不需要暴露给外面    def fit(self, X_train, y_train):        """根据训练数据集X_train, y_train训练Linear Regression模型"""        assert X_train is not None and y_train is not None, "训练集X和Y不能为空"        assert X_train.shape[0] == y_train.shape[0], "训练集X和Y的样本数要相等"        # np.linalg.inv(X) 表示求X的逆矩阵        # 不能忘了X要增加一列,第一列数据为0        ones = np.ones(shape=(len(X_train), 1))        X_train = np.hstack((ones, X_train))        self._theta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train)        self.intercept_ = self._theta[0]        self.coef_ = self._theta[1:]    def _predict(self, X):        return X.dot(self.coef_.T) + self.intercept_    def predict1(self, X_test):        """给定待预测数据集X_test,返回表示X_test的结果向量"""        assert X_test.shape[1] == self.coef_.shape[0], '测试集X的特征值个数不对'        return np.array([self._predict(X) for X in X_test])    def predict(self, X_test):        """给定待预测数据集X_test,返回表示X_test的结果向量"""        assert X_test.shape[1] == self.coef_.shape[0], '测试集X的特征值个数不对'        ones = np.ones(shape=(len(X_test), 1))        X_test = np.hstack((ones, X_test))        return X_test.dot(self._theta)    def scores(self, X_test, y_test):        """根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""        assert X_test.shape[0] == y_test.shape[0], '测试集X和Y的个数不相等'        return r2_score(y_test, self.predict1(X_test))

测试脚本:

# -*- encoding: utf-8 -*-from sklearn.datasets import load_bostonfrom model_selection import train_test_splitfrom linearregression import LinearRegressionboston = load_boston()X = boston.datay = boston.targetX = X[y < 50]y = y[y < 50]X_train, X_test, y_train, y_test = train_test_split(X, y, seed=666)lrg = LinearRegression()lrg.fit(X_train, y_train)# 为什么求出来的theta.shape== (13L,)print lrg.coef_print lrg.intercept_print (lrg.scores(X_test, y_test))

运行结果:

[-1.18919477e-01  3.63991462e-02 -3.56494193e-02  5.66737830e-02

 -1.16195486e+01  3.42022185e+00 -2.31470282e-02 -1.19509560e+00
  2.59339091e-01 -1.40112724e-02 -8.36521175e-01  7.92283639e-03
 -3.81966137e-01]
34.16143549624022
0.8129802602658537

实现总结:

1、上面的准确率是81.29%

2、在实现过程中,fit方法里面,忘了在X_train训练集中添加1的列向量,导致计算出来的系数矩阵参数不对

3、在pridect中,有两种实现方法,可以直接利用中间计算出来的theta值,也可以用X_test.dot(系数矩阵) + 截距举证

4、 np.hstack这个方法,参数值一个tuple,同时要注意相互之间的顺序,越是前面的矩阵则在合并后矩阵越靠前

5、在numpy中实现一个矩阵的逆矩阵用到的方法是np.linalg.inv方法

sklearn中的回归实现

# -*- encoding: utf-8 -*-from sklearn.datasets import load_bostonfrom sklearn.neighbors import KNeighborsRegressorfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_split, GridSearchCVdef test_regression():    boston = load_boston()    X = boston.data    y = boston.target    X = X[y < 50]    y = y[y < 50]    X_train, X_test, y_train, y_test = train_test_split(X, y)    # sklearn中的利用LinearRegression    lrg = LinearRegression()    lrg.fit(X_train, y_train)    print ('LinearRegression:', lrg.score(X_test, y_test))    # 利用KNN回归    knnrg = KNeighborsRegressor()    # 利用网格搜索找到最好的KNN参数    param_grid = [        {            'weights': ['uniform'],            'n_neighbors': [i for i in range(1, 11)]        },        {            'weights': ['distance'],            'n_neighbors': [i for i in range(1, 11)],            'p': [i for i in range(1, 6)]        }    ]    grid_search = GridSearchCV(knnrg, param_grid, n_jobs=-1, verbose=1)    grid_search.fit(X_train, y_train)    print 'GridSearchCV:', grid_search.best_estimator_.score(X_test, y_test)    print 'GridSearchCV Best Params:',  grid_search.best_params_if __name__ == '__main__':    test_regression()

运行结果:

LinearRegression: 0.7068690903842936

Fitting 3 folds for each of 60 candidates, totalling 180 fits
[Parallel(n_jobs=-1)]: Done 180 out of 180 | elapsed:    1.3s finished
GridSearchCV: 0.6994655719704079
GridSearchCV Best Params: {'n_neighbors': 10, 'weights': 'distance', 'p': 1}

sklearn中可以看到出来,线性回归还是要比KNN回归要好。此外也要注意,在使用网格搜索的时候,不能有grid_search.score()方法,而是用grid_search.best_estimator_.score方法,因为两个实现不一样。

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

你可能感兴趣的文章
PPT分享: Linux启动流程 关于initrd与initramfs的区分及其发展历程
查看>>
Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总
查看>>
Yocto i.MX6 (TQIMX6) (01) : 3.14.28内核的适配
查看>>
Yocto tips (6): Yocto中如何共享已经下载的文件
查看>>
Yocto tips (1): Yocto 编译后文件放在了哪里 输出文件位置
查看>>
Yocto tips (2): Yocto Linux内核编译目录在哪?
查看>>
Yocto tips (3): Yocto 如何重新编译Linux内核与dtb,并放到deploy目录?
查看>>
Yocto tips (4): Yocto 如何确定(找到)一个包的名字
查看>>
start kernel 之后没有任何输出与uboot无法将bootargs传入内核的调查方法与解决之道
查看>>
Yocto tips (5): Yocto如何更改source code的下载与git clone地址
查看>>
Yocto tips (7): Yocto Bitbake的clean与cleanall以及cleansstate的区别
查看>>
Yocto tips (19): Yocto SDK Toolchian的使用
查看>>
Yocto i.MX6 (TQIMX6) (04) : 使用mjpg-streamer做一个WebCam Server
查看>>
Nexus 7 Cyanogenmod OS Compile and errors
查看>>
Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例
查看>>
打造嵌入式ARM Linux防火墙:1. iptables基础
查看>>
4G模块SIMCOM7100 LTE在ARM Linux下使用PPPD上网
查看>>
为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
查看>>
原生Android系统的第一次开机google验证的解决
查看>>
S5P4418与S5P6618的Android boot.img的解压与压缩, Sparse ext4文件系统
查看>>