> 文章列表 > 机器学习-scikit-learn

机器学习-scikit-learn

机器学习-scikit-learn

文章目录

    • 前言
    • 线性回归模型-LinearRegression
    • 准备数据
    • 使用LinearRegression
    • 总结

前言

scikit-learn是Python中最流行的机器学习库之一,它提供了各种各样的机器学习算法和工具,包括分类、回归、聚类、降维等。

scikit-learn的优点有:

  • 简单易用:scikit-learn 的接口简单易懂,可以让用户很容易地上手进行机器学习。
    统一的API:scikit-learn 的 API 非常统一,各种算法的使用方法基本一致,使得学习和使用变得更加方便。
  • 大量实现了机器学习算法:scikit-learn 实现了各种经典的机器学习算法,而且提供了丰富的工具和函数,使得算法的调试和优化变得更加容易。
  • 开源免费:scikit-learn 是完全开源的,而且是免费的,任何人都可以使用和修改它的代码。
  • 高效稳定:scikit-learn 实现了各种高效的机器学习算法,可以处理大规模数据集,并且在稳定性和可靠性方面表现出色。
    scikit-learn因为API非常的统一而且模型相对较简单所以非常适合入门机器学习。
    这里我的推荐方式是结合官方文档进行学习,不仅有每个模型的适用范围介绍还有代码样例。
    scikit-learn官网地址

线性回归模型-LinearRegression

LinearRegression模型是一种基于线性回归的模型,适用于解决连续变量的预测问题。该模型的基本思想是建立一个线性方程,将自变量与因变量之间的关系建模为一条直线,并利用训练数据拟合该直线,从而求出线性方程的系数,再用该方程对测试数据进行预测。

LinearRegression模型适用于自变量和因变量之间存在线性关系的问题,例如房价预测、销售预测、用户行为预测等。当然,当自变量和因变量之间的关系为非线性时,LinearRegression模型的表现会比较差。此时可以采用多项式回归、岭回归、Lasso回归等方法来解决。

准备数据集

在抛开其它因素影响后,学习时间和学习成绩之间存在着一定的线性关系,当然这里的学习时间指的是有效学习时间,表现为随着学习时间的增加成绩也会增加。所以我们准备一份学习时间和成绩的数据集。数据集内部分数据如下:

学习时间,分数
0.5,15
0.75,23
1.0,14
1.25,42
1.5,21
1.75,28
1.75,35
2.0,51
2.25,61
2.5,49

使用LinearRegression

  • 确定特征和目标

在学习时间和成绩间,学习时间为特征,也即自变量;成绩为标签也即因变量,所以我们需要在准备好的学习时间和成绩数据集中提取特征和标签。

import pandas as pd
import numpy as np
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression# 读取学习时间和成绩CSV数据文件
data = pd.read_csv('data/study_time_score.csv')
# 提取数据特征学习时间
X = data['学习时间']
# 提取数据目标(标签)分数
Y = data['分数']
  • 划分训练集和测试集

在特征及标签数据准备好以后,使用scikit-learn的LinearRegression进行训练,将数据集划分为训练集和测试集。

"""
将特征数据和目标数据划分为测试集和训练集
通过test_size=0.25将百分之二十五的数据划分为测试集
"""
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25, random_state=0)x_train = X_train.values.reshape(-1, 1)model.fit(x_train, Y_train)
  • 选择模型,对数据进行拟合

将测试集和训练集准备好以后,我们就可以选择合适的模型对训练集进行拟合,以便能够预测出其它特征对应的目标

# 选择模型,选择模型为LinearRegression
model = LinearRegression()
# Scikit-learn中,机器学习模型的输入必须是一个二维数组。我们需要将一维数组转换为二维数组,才能在模型中使用。
x_train = X_train.values.reshape(-1, 1)
# 进行拟合
model.fit(x_train, Y_train)
  • 得到模型参数

由于数据集只包含学习时间和成绩两个是一个很简单的线性模型,其背后的数学公式也即y=ax+b,其中y因变量也就是成绩, x自变量也即学习时间。

"""
输出模型关键参数
Intercept: 截距 即b
Coefficients: 变量权重 即a
"""
print('Intercept:', model.intercept_)
print('Coefficients:', model.coef_)
  • 回测
    上面拟合模型只用到了测试集数据,下面我们需要使用测试集数据对模型的拟合进行一个回测,在使用训练集拟合后,我们就可以对特征测试集进行预测,通过得到的目标预测结果与实际目标的值进行比较,我们就可以得到模型的拟合度了。
# 转换为n行1列的二维数组
x_test = X_test.values.reshape(-1, 1)
# 在测试集上进行预测并计算评分
Y_pred = model.predict(x_test)
# 打印测试特征数据
print(x_test)
# 打印特征数据对应的预测结果
print(Y_pred)# 将预测结果与原特征数据对应的实际目标值进行比较,从而获得模型拟合度# R2 (R-squared):模型拟合优度,取值范围在0~1之间,越接近1表示模型越好的拟合了数据。
print("R2:", r2_score(Y_test, Y_pred))
  • 程序运行结果
  • 根据上述的代码我们需要确定LinearRegression模型的拟合度,也就是这些数据到底适合不适合使用线性模型进行拟合,程序的运行结果如下:
预测结果:
[47.43726068 33.05457106 49.83437561 63.41802692 41.84399249 37.8488009323.46611131 37.84880093 26.66226456 71.40841004 18.67188144 88.987252963.41802692 42.6430308  21.86803469 69.81033341 66.61418017 33.0545710658.62379705 50.63341392 18.67188144 41.04495418 20.26995807 77.8007165328.26034119 13.87765157 61.81995029 90.58532953 77.80071653 36.2507243184.19302303]
R2: 0.8935675710322939

总结

上述模型的拟合度达到了89%,如果你能接受大约10%的误差,则可以使用LinearRegression模型进行预测。当调整训练集大小小于25%时,模型的拟合度稍低于89%,数据集的大小和训练集的大小等因为都会影响模型的拟合度,需要不断尝试找到拟合效果的参数设定。