机器学习篇(六)

  • 2019 年 10 月 6 日
  • 筆記

模型的加载和保存

当把模型训练好以后就不会再使用训练集来预测,而是要实际去预测。这就涉及到模型的加载和保存。

需要用到的模块:

sklearn.externals.joblib

保存:joblib.dump()

加载:joblib.load()

以机器学习篇(五)中的线性回归为例,保存这个模型.

保存和加载都有两个参数:

第一个参数:算法(这里是线性回归算法,我的命名为lr)

第二个参数:保存的文件./test.pkl,就是保存到当前目录名字为test.pkl,结尾必须是pkl。

比如保存:

# 导入模型的加载和保存模块

from sklearn.externals import joblib

# 保存模型

joblib.dump(lr,"./test.pkl")

# 使用(加载)

lr_demo = joblib.load("./test.pkl")

# 预测(注意:可能你预测的数据集需要标准化处理)

y_predict = lr_demo.predict("预测的数据集")

逻辑回归

注意:逻辑回归其实是分类算法。

逻辑回归长用于:广告点击,是否为垃圾邮件等等。

不管是广告点击还是是否为垃圾邮箱,这些都是简单的二分类问题.也就是说逻辑回归擅长于二分类问题。

逻辑回归的公式和线性回归公式是一样的。所以线性回归中的问题,在逻辑回归中一样会遇见。

比如过拟合等。逻辑回归将一个线性回归的输入转换成了一个分类问题。这就是逻辑回归的核心。

这个核心叫做sigmoid函数。

sigmoid函数的样子:

sigmoid函数将闲心回归的输入转变成了0~1之间的值。这就转换成了概率问题。

该函数具有如下的特性:当x趋近于负无穷时,y趋近于0;当x趋近于正无穷时,y趋近于1;

当x= 0时,y=0.5.

也就是说将回归函数的值通过sigmoid函数映射成0~1之间的值就转换成了概率问题也就是分类问题。

由于逻辑回归和线性回归原理一样,但是由于转变成了分类问题,算是函数不一样,并且只能用梯度下降求解。

在逻辑回归中使用的损失函数是:对数似然损失函数。

对数似然损失函数的值越小,说明预测的类别准确率就越高。

逻辑回归模块:

sklearn.linear_model.LogisticRegression(penalty="l2",C=1.0)

参数一:penalty:正则化

参数二:C:正则化力度

通过正则化来解决过拟合。

实例:

预测是否患有癌症。在逻辑回归中以概率小的那个特征为依据,比如是否患有癌症,会算出

没有患癌症的概率计算出来。

数据来源:http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

数据属性:

# 导入线性回归算法  from sklearn.linear_model import LogisticRegression  # 导入分割数据集  from sklearn.model_selection import train_test_split  # 导入标准化  from sklearn.preprocessing import StandardScaler  # 导入召回率  from sklearn.metrics import classification_report  import pandas as pd  import numpy as np    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("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",names =column)      # 缺失值处理,替换?号      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)      lg.fit(x_train,y_train)      # 打印权重参数      print(lg.coef_)      # 预测值为      y_predict = lg.predict(x_test)      print("准确率为:",lg.score(x_test,y_test))      '''      [[1.03074162 0.33234542 1.0138588  0.5920222  0.27032191 1.283624      0.82755548 0.6176474  0.99989529]]      准确率为: 0.9590643274853801      '''      # 召回率      print("召回率为:",classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","恶性"]))      '''      召回率为:  precision recall    f1-score   support        良性         0.97      0.96      0.97       113      恶性         0.93      0.95      0.94        58        micro avg    0.96      0.96      0.96       171      macro avg    0.95      0.96      0.95       171      weighted avg 0.96      0.96      0.96       171      通过召回率可以看到:恶性的召回率只有95%。      '''  if __name__ == "__main__":      logistic()  

优点:适合需要得到分类概率的问题,简单,速度快

缺点:不好处理多分类问题