美文网首页
机器学习1-回归及聚类

机器学习1-回归及聚类

作者: Aptitude | 来源:发表于2019-03-27 23:05 被阅读0次

    回归问题及聚类

    • 单纯的回归问题,求解连续性数值
      期末成绩:0.7×考试成绩+0.3×平时成绩
    • 将分类问题转化为回归问题,求解分类问题
      西瓜好坏:0.2×色泽+0.5×根蒂+0.3×敲声

    1 线性关系模型

    定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合.
    一元线性回归:涉及到的变量只有一个;
    多元线性回归:涉及到的变量两个或两个以上。
    𝑓(𝑥)=𝑤_1 𝑥_1+𝑤_2 𝑥_2+…+𝑤_𝑑 𝑥_𝑑+𝑏
    w为权重,b称为偏置项,可以理解为:𝑤_0×1

    1.1 损失函数

    • 𝑦_𝑖为第𝑖个训练样本的真实值
    • ℎ_𝑤(𝑥_𝑖)为第𝑖个训练样本特征值组合预测函数
      总损失定义:
      𝐽(𝜃)= (ℎ_𝑤 (𝑥_1) −𝑦_1 )^2+(ℎ_𝑤 (𝑥_2) −𝑦_2 )^2+…+(ℎ_𝑤 (𝑥_𝑚) −𝑦_𝑚 )^2= ∑_(𝑖=1)^𝑚(ℎ_𝑤 (𝑥_𝑖 )−𝑦_𝑖)^2
      又称最小二乘法.
      在线性回归中,寻找最优化的w,使得损失最小。
    正规方程

    求解:𝑤=(𝑋^𝑇𝑋)^{−1}𝑋^𝑇𝑦
    𝑋为特征值矩阵,𝑦为目标值矩阵
    缺点:当特征过于复杂,求解速度太慢;对于复杂的算法,不能使用正规方程求解(逻辑回归等)。

    梯度下降
    梯度下降解释

    指定学习率,然后会沿着减小损失函数的方向进行靠近,直到找到损失值的最低点。


    二维特征

    1.2 波士顿房价预测分析流程

    (1) 数据获取
    (2)数据分割
    (3)训练与测试数据标准化处理
    (4)使用简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测。

    # 线性回归预测房子价格
    def mylinear():
        lb = load_boston()
        x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
        #特征值和目标值进行标准化处理,实例化两个标准化API
        std_x = StandardScaler()
        x_train = std_x.fit_transform(x_train)
        x_test = std_x.transform(x_test)
        std_y = StandardScaler()
        #喂入transform中必须保证是二维数组
        y_train = std_y.fit_transform(y_train.reshape(-1,1))
        y_test = std_y.transform(y_test.reshape(-1,1))
        #estimator预测
    ###########################正规方程求解方式预测结果################
        lr = LinearRegression()
        lr.fit(x_train,y_train)
        print(lr.coef_)
        #预测测试集的房子价格
        y_predict = std_y.inverse_transform(lr.predict(x_test))
        print("正规方程测试集中的预测价格",y_predict)
    #######################梯度下降求解方式预测结果######################
        SGD = SGDRegressor()
        SGD.fit(x_train,y_train)
        print(SGD.coef_)
        #预测测试集的房子价格
        y_sgd_predict = std_y.inverse_transform(SGD.predict(x_test))
        print("SGD测试集中的预测价格",y_sgd_predict)
        return None
    

    1.3 回归性能评估

    mean_squared_error(y_true, y_pred)
    均方误差回归损失
    y_true:真实值
    y_pred:预测值
    return:浮点数结果

    print("正规方程的均方误差:",mean_squared_error(y_test,y_predict))
    print("SGD的均方误差:", mean_squared_error(y_test, y_sgd_predict))
    

    正规方程与梯度下降的比较:


    正规方程与梯度下降(图源黑马程序员)

    2. 拟合问题

    过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
    欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

    欠拟合与过拟合
    线性回归不一定是只拟合出线性方程,对线性模型进行拟合会变成复杂模型。
    image.png
    欠拟合原因及解决办法:
    原因:学习到数据的特征过少;
    解决办法:增加数据的特征数量。
    过拟合原因及解决办法:
    原因: 始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
    解决办法:
    • 进行特征选择,消除关联性大的特征(很难做);
    • 交叉验证(让所有数据都有过训练);
    • 正则化,相当于特征选择的过程。
      在进行训练时要尽量减少高次项特征的影响。

    特征选择:

    • 过滤式:低方差特征
    • 嵌入式:正则化,决策树,神经网络

    2.2 L2正则化

    作用:可以使得W的每个元素都很小,都接近于0;
    优点:越小的参数说明模型越简单,越简单的模型则越不
    容易产生过拟合现象。

    3. 岭回归

    sklearn.linear_model.Ridge(alpha=1.0)

    • 具有l2正则化的线性最小二乘法;
    • alpha:正则化力度;
    • coef_:回归系数。
      岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让
      估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研
      究中有较大的实用价值。

    4. 模型的保存与加载

        #保存训练好的模型
        joblib.dump(lr,"test.pkl")
        #预测房价结果
        model = joblib.load("test.pkl")
    

    5. 逻辑回归

    逻辑回归解决的是二分类问题的利器。
    sigmoid把输入转化为0-1之间的值,可以理解为概率值,默认0.5作为阈值。


    image.png

    逻辑回归的处理流程如下:


    逻辑回归大致思路
    损失函数采用的是对数似然损失。在寻找最优解的过程中,对数似然损失会存在局部最低点,而均方误差不存在局部最小值。尽管没有全局最低点,但是效果都是很好。目前这个问题没有很好的解决方案,以下方式只能尽量改善:
    • 多次随机初始化,多次比较最小值结果;
    • 调整学习率。
      二分类问题哪一个类别少,判定概率值就是这个类别。

    良/恶性乳腺癌肿分类流程:

    (1)获取数据;
    (2)数据缺失值处理、标准化;
    (3)LogisticRegression估计器流程。

    #逻辑回归做二分类进行癌症预测,根据细胞的属性特征
    def logistic():
        #构造列标签名字
        column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
        #读取数据
        data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",names=column)
        #print(data)
        #缺失值进行处理
        data = data.replace(to_replace='?',value=np.nan)
        data = data.dropna()
        #数据分割
        x_train,x_test,y_train,y_test = train_test_split(data[column[1:10]],data[column[10]])
        #标准化处理
        std = StandardScaler()
        x_train = std.fit_transform(x_train)
        x_test = std.transform(x_test)
        #逻辑回归预测
        lg = LogisticRegression(C=1.0)
        lg.fit(x_train,y_train)
        print(lg.coef_)
        y_predict = lg.predict(x_test)
        print("准确率",lg.score(x_test,y_test))
        print("召回率",classification_report(y_test,y_predict,labels = [2,4],target_names=['良性','恶性']))
        return None
    
    运行结果
    应用:广告点击率预测、电商购物搭配推荐;
    优点:适合需要得到一个分类概率的场景;
    缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)。

    朴素贝叶斯与逻辑回归对比,如图:


    对比

    6. K-means

    6.1 步骤

    (1)随机设置K个特征空间内的点作为初始的聚类中心;
    (2)对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类
    中心点作为标记类别;
    (3)接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
    均值);
    (4)如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行
    第二步过程。

    6.2 性能评估指标

    轮廓系数:
    计算公式:𝑠𝑐_𝑖= (𝑏_𝑖−𝑎_𝑖)/(max⁡(𝑏_𝑖,𝑎_𝑖))
    注:对于每个点𝑖 为已聚类数据中的样本 ,𝑏𝑖 为𝑖 到其它族群的所有样本的平均
    距离,𝑎
    𝑖 为𝑖 到本身簇的距离平均值.
    最终计算出所有的样本点的轮廓系数平均值。

    • 如果𝑠𝑐𝑖 小于0,说明𝑎𝑖 的平均距离大于最近的其他簇。
      聚类效果不好;
    • 如果𝑠𝑐𝑖 越大,说明𝑎𝑖 的平均距离小于最近的其他簇。
      聚类效果好。
      {轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优}
      特点分析:采用迭代式算法,直观易懂并且非常实用。
      缺点:容易收敛到局部最优解(多次聚类)
      需要预先设定簇的数量(k-means++解决)

    相关文章

      网友评论

          本文标题:机器学习1-回归及聚类

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