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

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

接下来就用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这个主要用于查看预测结果和真是结果的差异dom

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

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

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

             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,2code

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

第二列recall表示召回率ci

第三列f1-score表示F1分数get

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

从这个结果来看,总体预测结果较好,平均准确率和召回率还有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()

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