机器学习实战 LR

来源:互联网 发布:c语言 线程优先级 编辑:程序博客网 时间:2024/06/13 10:35

 2 data files
      -- horse-colic.data: 300 training instances
      -- horse-colic.test: 68 test instances


1、Logistic回归的优缺点

优点:

  • 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。

缺点:

  • 容易欠拟合,分类精度可能不高。

2、其他

  • Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法完成。
  • 改进的一些最优化算法,比如sag。它可以在新数据到来时就完成参数更新,而不需要重新读取整个数据集来进行批量处理。
  • 机器学习的一个重要问题就是如何处理缺失数据。这个问题没有标准答案,取决于实际应用中的需求。现有一些解决方案,每种方案都各有优缺点。
  • 我们需要根据数据的情况,这是Sklearn的参数,以期达到更好的分类效果。

3.。处理缺失值:

     使用可用特征的均值来填补缺失值;

  • 使用特殊值来填补缺失值,如-1;
  • 忽略有缺失值的样本;
  • 使用相似样本的均值添补缺失值;
  • 使用另外的机器学习算法预测缺失值。

    预处理数据做两件事:

    • 如果测试集中一条数据的特征值已经确实,那么我们选择实数0来替换所有缺失值,因为本文使用Logistic回归。因此这样做不会影响回归系数的值。sigmoid(0)=0.5,即它对结果的预测不具有任何倾向性。
    • 如果测试集中一条数据的类别标签已经缺失,那么我们将该类别数据丢弃,因为类别标签与特征不同,很难确定采用某个合适的值来替换

    6

    使用Sklearn构建Logistic回归分类器

    在Sklearn中,我们就可以根据数据情况选择优化算法,比如数据较小的时候,我们使用liblinear,数据较大时,我们使用sag和saga。

    solver参数决定了我们对逻辑回归损失函数的优化方法,有4种算法可以选择,分别是:

        a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。

        b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

        c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。

        d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。关于SAG的理解,参考博文线性收敛的随机优化算法之 SAG、SVRG(随机梯度下降)

    newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinearL1正则化和L2正则化都可以。

        同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。

    class sklearn.linear_model.LogisticRegression(penalty=’l2’,dual=False, tol=0.0001, C=1.0, fit_intercept=True,intercept_scaling=1, class_weight=None, random_state=None,solver=’liblinear’, max_iter=100, multi_class=’ovr’, verbose=0, warm_start=False, n_jobs=1)[source]

    c:正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。(!这个与平时实验的时候不同,使用的是倒数)

    class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者'balanced'字符串,默认为不输入,也就是不考虑权重,即为None。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重。举个例子,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。

    那么class_weight有什么作用呢?

    • 在分类模型中,我们经常会遇到两类问题:
    • 1.第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
    • 2. 第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。

    http://blog.csdn.net/zouxy09/article/details/24971995关于各种范数

    在写代码的过程中,发现自己写的代码的问题往往是未将数据使用数组表示,可以为什么要转换为数组呢?

    NumPy数组可以将许多数据处理任务表述为简洁的数组表达式,否则需要编写循环。用数组表达式代替循环的做法,通常被称为矢量化。通常矢量化数组运算要比等价的纯Python方式快上一两个数量级,尤其是各种数值计算。

    python对txt文件的处理

    strip(rm):删除s字符串中开头、结尾处,rm字符。当rm为空时默认删除空白符(包括'\n', '\r',  '\t',  ' ')

    split(del):通过指定分隔符(del)对字符串进行切片,如果参数num有指定值,则仅分隔num个子字符串。

    利用for循环对列表中每一个元素进行处理,最后用numpy中的array函数将其转换成numpy数组,并用astype函数把字符串数组转换成int数组。(一个是转换为数组表示,另一个是数据类型)

    当然,对于字符串操作还有一个利器:正则表达式!

    如果不了解正则表达式又想用它来删除字符串中特定字符的话,这个是万能的,自己删吧!r='[’!"#$%&\'()*+,./:;<=>?@[\\]^_`{|}~]'

    正则表达式也是用来删除某些\n.\t之类的

    import numpy as npimport refile = open("1.txt","r")list_arr = file.readlines()lists = []r = '[’,[\\]]'for index,x in enumerate(list_arr):    a = re.sub(r,'',x)    c = a.strip()    c = c.split()    lists.append(c)m = np.array(lists)m = m.astype(int)print (m)file.close()


  • 原创粉丝点击