美文网首页
1机器学习(上)

1机器学习(上)

作者: 弟弟们的哥哥 | 来源:发表于2019-10-13 21:24 被阅读0次

    机器学习分三类:

    监督学习:Given D={x,y}, learn y=f(x) 当y为离散值时为分类问题,当y为连续值时为回归问题。常用于语音识别,搜索广告,商品推荐,机器翻译,个性化新闻等
    无监督学习: Given D={x}, learn y=f(x) 常用于聚类,降维,神经网络预训练等
    强化学习:解决的问题是,针对一个具体问题得到一个最优的policy,使得在该策略下获得的reward最大。所谓的policy其实就是一系列action。也就是sequential data。 用于游戏,机器人,自动驾驶等


    线性回归

    这个不用解释,直接上公式
    公式:

    image.png 损失函数(均方误差MSE,又叫最小二乘法):
    image.png 梯度下降(损失函数求导): image.png 在sklearn中的应用:
    #选择基于梯度下降的线性回归模型
    from sklearn.linear_model import LinearRegression
    LR_reg=LinearRegression()
    #进行拟合
    LR_reg.fit(x,target)
    #使用均方误差用于评价模型好坏
    from sklearn.metrics import mean_squared_error
    preds=LR_reg.predict(x)   #输入数据进行预测得到结果
    mse=mean_squared_error(preds,target)   #使用均方误差来评价模型好坏,可以输出mse进行查看评价值
    

    逻辑回归

    逻辑回归分两步走:

    • 第一步是输入x的线性回归函数
    • 第二步通过逻辑函数,如sigmoid将线性转换为非线性sigmoid公式 image.png 求导: image.png 损失函数:
      如果和线性回归一样,用MSE做为损失函数会出现什么情况?
      image.png 函数非凸,很容易陷入局部最优解,如果有最大似然函数作为损失函数了?
      image.png 这样成了凸函数,很容易求得参数最优解。既然用最大似然,那肯定是要最大化似然概率
      image.png 对于二分类来说
      image.png 相乘之后就是:
      image.png 代入后:
      image.png
      如果用hθ(xi)表示p0,1 - hθ(xi)表示p1,将max函数换成min,则得到最终形式:
      image.png 在sklearn中的应用:
    from sklearn.linear_model import LogisticRegression
    lr=LogisticRegression(multi_class='ovr',solver='sag',class_weight='balanced')
    lr.fit(x_tran,y_tran)
    score=lr.score(x_tran,y_tran)
    print(score) ##最好的分数是1
    

    KNN

    KNN简单一句话“近朱者赤,近墨者黑”,工作原理:

    • 1.计算待分物体与其他物体之间的距离
      1. 统计距离最近的K个邻居
      1. 对于K个邻居,它们属于哪个分类最多,待分物体就属于哪一类

    所以KNN核心在于距离如何计算,有5种距离计算方式:1. 欧式距离;2.曼哈顿距离;3.闵可夫距离;4.切比雪夫距离;5.余弦距离。前三种是KNN比较常用的。

    欧式距离:两点在空间中的距离
    二维空间中是

    image.png n维空间中是
    image.png 曼哈顿距离:两点在坐标系上绝对轴综合
    image.png 闵可夫距离:不是一个距离,是一组距离的定义,P代表空间维度,P=1时,就是曼哈顿距离;P=2时,就是欧式距离;P无穷大时,就是切比雪夫距离。
    image.png 余弦距离:计算的是两个向量的夹角,在方向上计算两者的差异。比如word embedding中两个词转换成one-hot编码,然后通过计算这两个词的余弦距离来判断这两个词的相似性。

    KNN计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升KNN搜索效率,提出了KD树(K-Dimensional)。在KD树种,每个节点都是K维熟知点的二叉树,既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。

    KNN分类

    from sklearn.neighbors import KNeighborsClassifier
    

    KNN回归

    from sklearn.neighbors import KNeighborsRegressor
    

    如何在 sklearn 中创建 KNN 分类器。使用构造函数

    KNeighborsClassifier(n_neighbors=5, weights=‘uniform’,algorithm=‘auto’, leaf_size=30)
    
    • 1.n_neighbors:即 KNN 中的 K 值,代表的是邻居的数量。K 值如果比较小,会造成过拟合。如果 K 值比较小,会造成过拟合。如果 K 值比较大,无法将未知物体分类出来。一般我们使用默认值 5。
    • 2.weights:是用来确定邻居的权重,有三种方式: weights=uniform,代表所有邻居的权重相同; weights=distance,代表权重是距离的倒数,即与距离成反比; 自定义函数,你可以自定义不同距离所对应的权重。大部分情况下不需要自己定义函数。
    • 3.algorithm:用来规定计算邻居的方法,它有四种方式: algorithm=auto,根据数据的情况自动选择适合的算法,默认情况选择 auto; algorithm=kd_tree,也叫作 KD 树,是多维空间的数据结构,方便对关键数据进行检索,不过 KD 树适用于维度少的情况,一般维数不超过 20,如果维数大于 20 之后,效率反而会下降; algorithm=ball_tree,也叫作球树,它和 KD 树一样都是多维空间的数据结果,不同于 KD 树,球树更适用于维度大的情况;algorithm=brute,也叫作暴力搜索,它和 KD 树不同的地方是在于采用的是线性扫描,而不是通过构造树结构进行快速检索。当训练集大的时候,效率很低。
    • 4.leaf_size:代表构造 KD 树或球树时的叶子数,默认是 30,调整 leaf_size 会影响到树的构造和搜速度。

    SVM

    想象一下一个空间散落着正样本和负样本,如果能找到一个超平面,正好能将正负样本分开。你脑子里就会问怎么去找到这个超平面,如果找不到怎么尽可能找到最接近的超平面来对正负样本进行分类,这就是SVM要解决的问题。(如果在一维空间就是一个点,二维空间就用一条线来区分,三维空间用超平面来分类,依次类推。用来区分的我们统称为超平面)

    1. 完全线性可分情况下的线性分类器,也就是线性可分的情况,是最原始的SVM,它最核心的思想就是找到最大的分类间隔;

    d代表是xi到超平面wxi+b的欧式距离,我们想得到d的最小值。||w||为超平面的范数,范数是向量的大小。


    image.png 然后是分类超平面ll和NN个样本xixi的“间隔”的表达式: image.png 接着求解能使间隔最大化的参数w和b,即求解以下优化函数:
    image.png

    2. 大部分线性可分情况下的线性分类器,引入了软间隔的概念。软间隔,就是允许一定量的样本分类错误;

    硬软间隔:如果数据是完全线性可分的,那么学到的模型都可称为硬间隔,就是把数据完全分类准确。软间隔,就是容许一定量的样本分类错误。实际中数据一般没那么“干净”,或多或少都存在早点,所以线性可分是个理想情况,都会使用到软间隔。

    image.png
    3. 线性不可分情况下的非线性分类器,引入了核函数。它让原有的样本空间通过核函数投射到了一个高维的空间中,从而变得线性可分。

    核函数:下图这种情况就没法处理,所以可以将样本从原始空间映射到一个更高维度的特质空间中,是的样本在新空间中线性可分。

    image.png 所以在非线性 SVM 中,核函数的选择就是影响 SVM 最大的变量。最常用的核函数有线性核、多项式核、高斯核、拉普拉斯核、sigmoid 核,或者是这些核函数的组合。这些函数的区别在于映射方式的不同。通过这些核函数,我们就可以把样本空间投射到新的高维空间中。

    Sklearn中的svm

    from sklearn import svm
    

    回归时,用SVR或linearSVR
    分类时,用SVC或LinearSVC

    如何创造一个SVM分类器:

    1. 用SVC 的构造函数:model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=auto’),这里有三个重要的参数 kernel、C 和 ggamma。kernel 代表核函数的选择,它有四种选择,只不过默认是 rbf,即高斯核函数。 linear:线性核函数 poly:多项式核函数 rbf:高斯核函数(默认) sigmoid:sigmoid 核函数。
    2. 输入训练集进行训练 model.fit(train_x, train_y)
    3. model.predict(test_y)进行预测得到prediction.

    同样我们也可以创建线性 SVM 分类器,使用 model=svm.LinearSVC()。在 LinearSVC 中没有kernel 这个参数,限制我们只能使用线性核函数。由于 LinearSVC 对线性分类做了优化,对于数据量大的线性可分问题,使用 LinearSVC 的效率要高于 SVC。

    相关文章

      网友评论

          本文标题:1机器学习(上)

          本文链接:https://www.haomeiwen.com/subject/cpywpctx.html