使用scikit实现回归


scikit-learn是一个由Python开发的免费开源机器学习库,它提供了现成的功能来实现诸如线性回归分类器、SVM、k-means和神经网络等多种算法,以及一些可以直接用于训练和测试的样本数据集。是目前机器学习应用程序中使用最广泛的库之一。

安装scikit

可以直接使用pip进行安装:

pip install scikit-learn

什么是学习

学习就是人类通过观察、积累经验,掌握某项技能或能力。就好像我们从小学习识别字母、认识汉字,就是学习的过程。而机器学习(Machine Learning),顾名思义,就是让机器(计算机)也能向人类一样,通过观察大量的数据和训练,发现事物规律,获得某种分析问题、解决问题的能力。

所以机器学习可以定义为: 机器从数据中总结经验,从数据中找出某种规律或者模型,并用它来解决实际问题。

机器学习步骤

  1. 提出问题
  2. 理解数据
  3. 数据清洗
  4. 构建模型
  5. 评估模型

线性回归

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。下面使用scikit来实现一个线性回归模型

构建数据

首先需要构建样本数据,代码如下:

import pandas as pd
from collections import OrderedDict


exam_dict = {"学习时长": [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],
             "分数": [10, 22, 13, 43, 20, 22, 33]}


exam_order_dict = OrderedDict(exam_dict)

df = pd.DataFrame(exam_order_dict)

# 查看数据是否符合预期
print(df.head())

exam_X = df.loc[:, "学习时长"]
exam_y = df.loc[:, "分数"]

通过图表可以很直观地观察其相关性情况,因此我们可以使用matplotlib将数据绘制成图表,代码如下:

# 引入matplotlib
import matplotlib.pyplot as plt

## 绘制散点图
plt.scatter(exam_X, exam_y, color='b', label='exam data')

plt.xlabel("Hours")
plt.ylabel("Score")

# 显示图
plt.show()
建立训练和测试数据

交叉验证(Cross-validation)指的是在给定的建模样本中,拿出大部分的数据用来训练模型,留下小部分数据对模型进行测试。可以使用train_test_split函数将样本按比例选取训练数据和测试数据。代码如下:

# 分割数据
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(exam_X,
                                                    exam_y,
                                                    train_size=0.8)

# 输出数据
print(X_train.shape)
print(y_train.shape)

# 绘制成图
plt.scatter(X_train, y_train, color='b', label='train data')
plt.scatter(X_test, y_test, color='red', label='test data')

plt.legend(loc=2)

plt.xlabel("Hours")
plt.ylabel("Score")

# 显示图
plt.show()
训练模型

训练模型的步骤为:

  1. 将训练数据特征和标签转换成二维数组
  2. 训练模型
  3. 建立最佳拟合曲线

代码如下:

# 将训练数据特征和标签转换成二维数组
X_train = X_train.values.reshape(-1, 1)
y_train = y_train.values.reshape(-1, 1)

# 训练模型
from sklearn.linear_model import LinearRegression

# 创建模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

绘制拟合曲线

可以使用matplotlib将拟合曲线绘制出来,代码如下:

# 绘制曲线
plt.scatter(X_train, y_train, color='b', label='train data')

# 训练数据的预测
y_train_pred = model.predict(X_train)

# 绘制曲线
plt.plot(X_train, y_train_pred, color='black',
         linewidth='3', label='best line')

# 添加图表标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")

# 显示图
plt.show()

评估模型

当模型训练好之后,需要使用验证数据对模型进行评估,如果评估效果好,则说明模型泛化能力比较好,可以拿到更多的场景中进行使用,反之则说明模型泛化能力不好,需要重新调整。代码如下:

# 使用测试数据集对模型进行测试
rdf = df.corr()
X_test = X_test.values.reshape(-1, 1)
y_test = y_test.values.reshape(-1, 1)

# 使用模型对测试数据进行打分
print(model.score(X_test, y_test))

逻辑回归

逻辑回归又称逻辑回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。下面的例子是用逻辑回归分析学习时间与考试分数的相关性,但是此时考试分数只有0和1,分别代表不及格和及格。

构造数据

数据构造过程和上面线性回归的部分基本一致,区别在于将分数改为通过考试了。代码如下:

import pandas as pd
from collections import OrderedDict

exam_dict = {"学习时长": [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],
             "通过考试": [0, 0, 0, 1, 0, 1, 1]}

exam_order_dict = OrderedDict(exam_dict)

df = pd.DataFrame(exam_order_dict)

# 查看数据是否符合预期
print(df.head())


# 提取特征和标签
exam_X = df.loc[:, "学习时长"]
exam_y = df.loc[:, "通过考试"]

# 绘制曲线
# 引入matplotlib
import matplotlib.pyplot as plt

## 绘制散点图
plt.scatter(exam_X, exam_y, color='b', label='exam data')

plt.xlabel("Hours")
plt.ylabel("Pass")

# 显示图
plt.show()

建立训练数据和测试数据

同样使用train_test_split函数将数据进行分割:

# 分割数据
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(exam_X,
                                                    exam_y,
                                                    train_size=0.8)

# 输出数据
print(X_train.shape)
print(y_train.shape)

# 绘制成图
plt.scatter(X_train, y_train, color='b', label='train data')
plt.scatter(X_test, y_test, color='red', label='test data')

plt.legend(loc=2)

plt.xlabel("Hours")
plt.ylabel("Score")

# 显示图
plt.show()

训练模型

模型训练和线性回归的步骤基本一致,区别在于使用LogisticRegression替换了LinearRegression。代码如下:

# 引入logisticRegression的类库
from sklearn.linear_model import LogisticRegression

# 将训练数据特征和标签转换成二维数组
X_train = X_train.values.reshape(-1, 1)
y_train = y_train.values.reshape(-1, 1)

model = LogisticRegression()
model.fit(X_train, y_train)

评估模型

模型评估和线性回归一样,都是用模型对测试数据进行预测:

# 验证模型
X_test = X_test.values.reshape(-1, 1)
y_test = y_test.values.reshape(-1, 1)
print(model.score(X_test, y_test))

至此,逻辑回归的模型也训练好了。

:)