一、线性模型----线性回归LinearRegression、逻辑回归LogisticRegression(代码篇)

写在最前:

机器学习中的代码学习相对于理论来说更容易一些,代码只是将数学的公式进行编辑并快速运算。公式全都封装成了API,只要在Python中去调用函数就能实现简单的功能(调包侠哈哈哈)。

sklearn是Python最常用的机器学习包。https://sklearn.apachecn.org/这是中文网站,大家最主要还是根据官方的手册学习。而随着学习门槛越来越低,只有增加对代码背后数学的理解,才能增加自身的竞争力。所有的代码我都会上传到自己的GitHub上。https://github.com/Uncle-Yuanl/Machine-Learning

包的使用

  • 训练:包.fit(x_train, y_train)

  • 预测:包.predict(y_test)

fit完以后,模型就会带有相应的属性,比如coef_(w),intercept_(b)等。就像一个毫无感情的做菜机器人一样,给他菜和调味就能做出顿饭。然而数据的前处理preprocessing(洗菜,择菜的过程)很大程度上决定了最后的学习效果。

LinearRression基本型:

LinearRegression(fit_intercept=Truenormalize=Falsecopy_X=Truen_jobs=None)

参数:fit_intercept:布尔值,可选,默认为True

                   是否计算模型的截距,就是b。

           normalize:布尔值,可选,默认为False

                    当fit_intercept设置为False时,将忽略该参数

                    如果为True,X会被归一化,x= \frac{x-\overline{x}}{\left \| x \right \|_{2}}

                    如果设为False又想要已知数据标准化,使用sklearn.preprocessing.StandardScaler

             关于normalization、standardization、regularization的比较见文末。

    copy_X:布尔值,可选,默认为False

             如果为True,X被复制;否则可以被覆盖。

    n_jobs:整数或者None, 可选,默认为None

             决定电脑计算的多进程或多线程

属性:coef_:形状为 (n_features, ) 或者(n_targets, n_features)的数组。

                     参数\boldsymbol{w}。n_features:属性个数;n_targets:目标个数,理解为y的维度。

           intercept_:浮点数或者形状为(n_targets,)的数组。

                     线性模型中的独立项b。

           rank:整数。

                     x的秩,只有x非奇异时能够访问。

           singular_:形状为(min(X, y),)的数组

                      x的奇异值。

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

方法:fit(X,y,sample_weight):进行参数估计

                sample_weight形状为(n_samples,)的数组,考虑样本自身对于y的权重时设置。

            predict(X) : 预测新样本的值

            score(X, y[, sample_weight]) :返回决定系数R^{2}

                  R^{2}=1-\frac{\sum_{i=1}^{m}\left ( y-\widehat{y} \right )^{2}}{\sum_{i=1}^{m}\left ( y-\overline{y} \right )^{2}},越大表示拟合效果越好。

          set_params():设置参数

                  不仅可以在简单模型中使用,也可以结合Pipeline使用,使得可以设置其他函数的参数,如PolynomialFeatures。在上传的代码中有详细讲解。

           get_params(deep=True): 获取模型参数。

                   参数名映射到它们的值。如果为真,将返回此估计器的参数以及包含的作为估计器的子对象。这里的参数并不是wb,而是模型本身的信息。通过字典的格式返回,我们可以通过[‘name’]来获得对应的值。

                      

 

 

 

LogisticRegression基本型:

LogisticRegression(penalty='l2'dual=Falsetol=0.0001C=1.0fit_intercept=Trueintercept_scaling=1class_weight=Nonerandom_state=Nonesolver='lbfgs'max_iter=100multi_class='auto'verbose=0warm_start=Falsen_jobs=Nonel1_ratio=None)

哇,一下子多了好多的参数。挑出一些重点的写一下把。

C:浮点数,正则化系数的倒数,越小则正则化强度越大。

solver:求解器, {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},默认‘lbfgs’

           官方文档对于求解去给出了详尽的解释。这里只放结果图。

dual:布尔值,默认为False。只有在penalty='l2'且solver=‘liblinear’使用。样本个数>属性个数,倾向于设为False。

tol:浮点数。默认1e-4。两次迭代的差别小于这个数就停止迭代。

max_iter:最大迭代次数。

intercept_scaling:浮点数solver =‘liblinear’ 且fit_intercept=True时使用。在上一节的多元回归中,\boldsymbol{X}这个大矩阵在最后加了一列                                           全1向量,这个就是将1换成intercept_scaling,则最后的b也会相应放缩。

class_weight:字典或者‘balanced’,默认None。类权重。如果是‘balanced’则类出现频率的反比来调整类的权重(改善类别不                                              平衡)。出现次数多的类则权重小。

l1_ratio:浮点数,默认为None。penalty=‘Elastic-Net’时使用。弹性网Elastic-Net的l1正则化系数。

multi_class:{‘ovr’, ‘multinomial’, ‘auto’}, 默认’auto’。多分类参数,与solver参数有较强联系。详细看文档以及西瓜书。

超参数与模型性能

超参数不是模型学习得到的参数,而是需要人工调整的参数,如l1_ratio。如何确定这些参数,最常用的就是交叉验证。通过给定一个超参数的集合,将每个候选超参数带入模型计算,在根据模型的性能来确定超参数。现在交叉验证直接可以调用LogisticRegressionCV,确定一个cv值就可以。

性能评估最常见就是score值以及roc曲线,相关函数在sklearn的metrics包中。

y = np.array([0, 0, 1, 1])
y_pred = np.array([0.1, 0.5, 0.3, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, y_pred)
fpr = np.insert(fpr, 0, 0)
tpr = np.insert(tpr, 0, 0)
auc = metrics.auc(fpr, tpr)
print(auc)
print(metrics.roc_auc_score(y, y_pred))
plt.plot(fpr, tpr, marker='o', lw=2, ls='-', mfc='g', mec='g', color='r')
plt.show()

鸢尾花数据的roc曲线如下图。

具体示例

还是看具体的代码吧。在使用中会出现的问题都注释了。线性模型确实简单,但还是需要多动手打代码,多分析出来的结果。欢迎大家一起讨论。

 

 

参考博客:

normalization、standardization、regularization的比较:

https://blog.csdn.net/castlehe/article/details/88988267

线性多元回归数据检验和代码实现:

https://blog.csdn.net/weixin_40683253/article/details/81109129

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值