机器学习算法基础3 - 回归算法

  • 模型保存
from sklearn.externals import joblib

# 模型保存
joblib.dump(model, "./tmp/test.pkl")  #(模型对象,保存路径)

# 模型读取
model = joblib.load("./tmp/test.pkl")

回归:连续性数据

  • 线性回归模型
    通过特征的线性组合作为预测函数。 机器学习算法基础3 - 回归算法_第1张图片

    1. 损失函数
      最小二乘法 机器学习算法基础3 - 回归算法_第2张图片

    2. 系数矩阵w求解
      -1- 正规方程 (sklearn.linear_model.LinearRegression)
      在这里插入图片描述
      缺点: 当特征数量多而复杂时,求解速度慢,复杂算法无法通过正规方程求解。

      from sklearn.datasets import load_boston
      from sklearn.linear_model import LinearRegression, SGDRegressor
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import StandardScaler
      from sklearn.metrics import mean_squared_error
      
      def mylinear():
          """
          线性回归直接预测房子价格
          :return: None
          """
          # 获取数据
          lb = load_boston()
      
          # 分割数据集到训练集和测试集
          x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
      
          print(y_train, y_test)
      
          # 进行标准化处理(?) 目标值处理?
          # 特征值和目标值是都必须进行标准化处理, 实例化两个标准化API
          std_x = StandardScaler()
          x_train = std_x.fit_transform(x_train)
          x_test = std_x.transform(x_test)
      
          # 目标值
          std_y = StandardScaler()
          y_train = std_y.fit_transform(y_train)
          y_test = std_y.transform(y_test)
      
          # estimator预测
          # 正规方程求解方式预测结果
          lr = LinearRegression()
          
          lr.fit(x_train, y_train)
          
          print(lr.coef_)
          
          # 预测测试集的房子价格
          y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
      
          print("正规方程测试集里面每个房子的预测价格:", y_lr_predict)
      
          print("正规方程的均方误差:",
          mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))	    
      

      -2- 梯度下降(sklearn.linear_model.SGDRegressor)
      机器学习算法基础3 - 回归算法_第3张图片

      from sklearn.linear_model import SGDRegressor
      
      # 梯度下降去进行房价预测
      sgd = SGDRegressor()
      
      sgd.fit(x_train, y_train)
      
      print(sgd.coef_)
      
      # 预测测试集的房子价格
      y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
      
      print("梯度下降测试集里面每个房子的预测价格:", y_sgd_predict)
      
      print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
      
      

      -3- 两者比较
      机器学习算法基础3 - 回归算法_第4张图片

  • 岭回归(sklearn.linear_model.Ridge)
    带有l2正则化的最小二乘法线性回归,解决过拟合问题。

    from sklearn.linear_model import Ridge
    
    # 岭回归去进行房价预测
    rd = Ridge(alpha=1.0)
    
    rd.fit(x_train, y_train)
    
    print(rd.coef_)
    
    # 预测测试集的房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    
    print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict)
    
    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
    
  • 逻辑回归 (sklearn.linear_model.LogisticRegression)
    属于分类模型,将线性回归输入转化为分类结果(概率值)输出。在二分类问题中,概率值一般是指样本中类别占比较少的那一部分的概率。
    机器学习算法基础3 - 回归算法_第5张图片
    sigmoid函数
    机器学习算法基础3 - 回归算法_第6张图片
    对数似然损失函数
    在这里插入图片描述
    在这里插入图片描述机器学习算法基础3 - 回归算法_第7张图片 完整损失函数
    在这里插入图片描述

    from sklearn.linear_model import LogisticRegression
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import classification_report
    
    def logistic():
        """
        逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
        :return: None
        """
        # 构造列标签名字
        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]], test_size=0.25)
    
        # 进行标准化处理
        std = StandardScaler()
    
        x_train = std.fit_transform(x_train)
        x_test = std.transform(x_test)
    
        # 逻辑回归预测
        lg = LogisticRegression(C=1.0) #C为正则化lambda
    
        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
    

    逻辑回归优缺点:
    优点:可以得到的结果有概率解释;简单,速度快;参数代表各特征的影响,可解释性强;
    缺点:不能处理多分类问题;属于线性分类器,难处理特征间相关的问题;特征空间较大时,性能不好;容易发生欠拟合。


  • 欠拟合与过拟合
    欠拟合:模型在训练集和测试集均不能获得好的预测结果,模型过于简单。
    过拟合:模型在训练集获得很好的预测结果,但在测试集预测误差大,模型过于复杂。
    机器学习算法基础3 - 回归算法_第8张图片

    • 欠拟合
      原因: 模型学习到的数据特征太少
      解决办法: 增加数据的特征数量

    • 过拟合
      原因: 原始特征过多,存在嘈杂特征,模型过度关注每个样本的特征。
      解决办法: 特征选择,消除关联性大的特征;交叉验证;正则化。


  • 判别模型与生成模型
    根据是否需要先验概率划分为判别模型生成模型,判别模型不需要,生成模型需要。先验概率为通过历史数据总结的概率信息。

    判别模型:k-近邻、决策树、神经网络等
    生成模型:朴素贝叶斯、隐马尔可夫模型等


  • 非监督学习算法

    • 聚类算法(k-means算法)(sklearn.cluster.KMeans)
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    
    x = data[:500]
    
    # 假设分为四类
    km = KMeans(n_cluster = 4)
    
    km.fit(x)
    
    predict = km.predict(x)
    
    # 显示聚类结果
    plt.figure(figsize = (10,10))
    
    # 建立四个颜色列表
    colored = ['orange', 'green', 'blue', 'purple'] 
    color = [colored[i] for i in predict]
    plt.scatter(x[:,1], x[:,2], color = color)
    

    k-means性能评估 (sklearn.metrics.silhouette_score)
    机器学习算法基础3 - 回归算法_第9张图片

    from sklearn.metrics import silhouette_score
    
    # 评判聚类效果-轮廓系数
    silhouette_score(x, predict)
    

    k-means优缺点:
    优点: 迭代式算法,直观易懂,实用。
    缺点: 收敛速度慢,时间复杂度高,容易收敛到局部最优解,需多次聚类;需要事先确定超参数k,对离群点和噪声敏感。

你可能感兴趣的:(机器学习基础算法,机器学习,python)