机器学习-逻辑回归与线性回归

logistic回归与线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized 
linear 
model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的logistic回归。而逻辑回归是用于分类问题,线性回归才是用于回归问题的。

接下来就用python的sklearn实现一个例子,这里用到了skearn中的load_iris数据

#第二天 逻辑回归与线性回归
#导入iris数据
from sklearn.datasets import load_iris
#导入回归方法
from sklearn.linear_model import LinearRegression,LogisticRegression
#导入拆分数据集的方法
from sklearn.model_selection import train_test_split
#用于分析验证测试结果
from sklearn.metrics import confusion_matrix,classification_report

# 载入sklearn数据
iris = load_iris()
# 获取特征数据
iris_data = iris['data']
# 特征列名
columns = iris['feature_names']
# 获取签值
iris_label = iris['target']

# 拆分训练集和测试集
train_x,test_x,train_y,test_y = train_test_split(iris_data,iris_label,test_size=0.3)
clf = LogisticRegression()
#训练
clf.fit(train_x,train_y)
#预测
predict_y = clf.predict(test_x)

print(confusion_matrix(test_y,predict_y))
print(classification_report(test_y,predict_y))

代码很简单,导入数据和训练基本上就是这样,这里说一下confusion_matrix这个主要用于查看预测结果和真是结果的差别

[[18  0  0]
 [ 0 13  1]
 [ 0  1 12]]

以上结果,列是预测结果数量,行是真是结果数量,在对角线上的数据说明预测和真实结果一直,这里看第二行三列,这里就说明真实结果是类型二结果预测成为类型三。

让后就是classification_report这个方法可以看到预测结果的一些信息,比如准确率,召回率等等

             precision    recall  f1-score   support

          0       1.00      1.00      1.00        18
          1       0.93      0.93      0.93        14
          2       0.92      0.92      0.92        13

avg / total       0.96      0.96      0.96        45

可以看到有三个类型0,1,2

第一列precision表示准确率,从上往下意思是预测为0类的准确率为1,预测为1类的准确率是0.93,预测为2类的准确率是0.92,最后一行是平均准确率。

第二列recall表示召回率

第三列f1-score表示F1分数

第四列support表示改分类有多少样本

从这个结果来看,整体预测结果较好,平均准确率和召回率还有F1都比较理想,特别是在类型0上是完全准确,类别2和3相对要差一点。

由于数据特征有3个无法用matplotlib可视化,下面我们用一个特征的数据实现一下线性回归并且可视化出来。

import numpy as np
from matplotlib import pyplot as plt

#生成二维的线性散点,加入一些偏移量
x = np.linspace(0, 50, 100) + 2*np.random.randn(100)
y = 2*x + 5*np.random.randn(100)
#预测需要的x值二维数组,用此方法将数组转换成二维的
x = x.reshape(-1,1)
# 上面例子有,同样是拆分训练集和测试集
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3)
# 我们先画一下训练集和测试集的数据吧
plt.figure(figsize=(16,6))
plt.subplot(1,2,1)
plt.scatter(train_x,train_y,label='train data')
plt.legend()
plt.subplot(1,2,2)
plt.scatter(test_x,test_y,label='test data')
plt.legend()
plt.show()

左边的训练集,右边的是测试集,接下来我们用训练集开始训练,让后用测试集来测训练的效果,并且打印出来

# 线性回归方法
clf = LinearRegression()
# 用训练集训练
clf.fit(train_x,train_y)
# 预测测试集
predict_y = clf.predict(test_x)
# 打印出来
plt.figure(figsize=(8,6))
plt.xlim([-5,55])
plt.ylim([-10,110])
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(test_x,test_y,c='r',label='really')
plt.plot(test_x,predict_y,color='b',label='predict')
plt.legend()
plt.show()

红色点是真是测试集数据,蓝线是预测的线性模型。

posted @ 2019-02-14 11:23  依封剑白  阅读(438)  评论(0编辑  收藏  举报