1.5、机器学习-回归算法

1、线性回归模型

线性回归模型 (Liner Regression),是利用线性拟合的方式来探寻数据背后的规律。通过搭建线性回归模型,可以寻找这些散点(也称样本点)背后的趋势线(也称回归曲线)。

借助回归曲线,我们可以进行一些简单的预测分析,或因果关系分析

1.1、一元线性回归数学原理

一元线性回归模型也称为简单线性回归模型,其形式可以通过如下方程公式表达:

其中:y是目标(因)变量,x是特征(自)变量,a表示回归系数,b表示截距。

一元线性回归的目的,是拟合出一条线使得预测值()和实际值()尽可能的接近,如果大部分点都落在拟合出来的线上,那么该线性回归模型拟合效果较好。

此外,我们可以通过两者差值平方和(,也称为残值平方和)来进行衡量,在机器学习领域,该残差平方和也被称之为回归模型的损失函数

1.2、一元线性回归的代码实现

在Python中,我们可以通过Scikit-learn工具库,快速构建一元线性回归模型。实现一元线性回归的核心功能代码如下:

python 复制代码
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot as plt
import matplotlib

# pycharm工具:设置本地显示后端
matplotlib.use('TkAgg')

if __name__ == '__main__':
    X = [[1],[2],[3],[5]]
    Y = [2,4,6,8]
    # 1. 构建线性回归模型对象
    lg = LinearRegression()
    # 2. 使用准备的自变量、因变量数据做训练
    lg.fit(X, Y)
    # 3. 使用训练好的模型预测新数据集
    y_pred = lg.predict([[4]])
    print(f"预测值:{y_pred[0]:.4f}") # 6.8571

    # 4. 绘制自变量、因变量组成的散点图
    plt.scatter(X, Y, label='实际数据')
    # 5. 绘制训练结果一元线性回归方程
    plt.plot(X, lg.predict(X), color='red', label='回归线')
    # 6. 展示执行效果|或使用Jupyter执行效果
    plt.show()

借助matplotlib工具,将模型进行可视化展示:

1.3、多元线性回归

同理,多元线性回归模型是在一元线性回归模型基础上,增加多个自变量,其形式可以通过如下方程公式表达:

其中:y是目标(因)变量,是特征(自)变量,表示权重系数,表示(误差项)截距。

线性回归使用均方误差(MSE)作为损失函数

1.3.1、经典案例

此处,我们使用波士顿房价数据集(Boston Housing Dataset)一个经典的回归分析数据集,常用于预测房价。

python 复制代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

if __name__ == '__main__':
    # 1. 数据加载
    data = pd.read_csv("boston_house_prices.csv", skiprows=1)
    # 2. 特征和标签分离
    X = data.loc[:, :"LSTAT"].to_numpy()  # 特征
    y = data.loc[:, "MEDV"].to_numpy()    # 目标标签
    # 3. 数据切分
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=0
    )
    # 4. 手动数据标准化(可用标准库实现)
    mu = X_train.mean(axis=0)
    sigma = X_train.std(axis=0) + 1e-9
    X_train = (X_train - mu) / sigma
    X_test = (X_test - mu) / sigma
    # 5. 模型训练
    lr = LinearRegression()
    lr.fit(X=X_train, y=y_train)
    # 6. 预测与评估
    y_pred = lr.predict(X=X_test)
    mse = ((y_pred - y_test) ** 2).mean()
    print(f"均⽅误差: {mse}")

1.3.2、实战案例

案例:基于线性回归模型的客户价值预测

客户价值可以帮助企业预测未来一段时间,客户预计能够为企业带来多少利润。尝试结合已有的客户价值数据表,完成以下功能。

1、结合客户的价值数据,构建回归模型;

|------------|----------|--------|---------|--------|-----------|----------|
| 历史贷款金额 | 贷款次数 | 学历 | 月收入 | 性别 | 是否有房产 | 客户价值 |
| 50000 | 2 | 2 | 20000 | 1 | 1 | 2000 |
| 50000 | 3 | 1 | 15000 | 0 | 0 | 1200 |

100000 5 2 32000 1 0 1800
python 复制代码
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

if __name__ == '__main__':
    # 1. 加载数据
    df = pd.read_csv("cust_value_data.csv", skiprows=1)
    # 2. 查看原始数据信息
    print("原始数据前10行:")
    print(df.head(10))
    print("\n数据信息:")
    print(df.info())
    print("缺失值统计:")
    print(df.isnull().sum())

    # 3. 找出存在null值的行
    null_rows = df[df.isnull().any(axis=1)]
    print("\n存在缺失值的行:")
    print(null_rows)

    # 4. 数据预处理
    # 4.1. 均值填充:将age为null的使用均值填充
    age_mean = df['age'].mean()
    df['age'].fillna(age_mean, inplace=True)
    # 4.2. 缺失值填充:将贷款均值填充
    history_debit_mean = df['history_debit'].mean()
    df['history_debit'].fillna(history_debit_mean, inplace=True)
    # 4.3. 缺失值填充:将月收入均值填充
    month_income_mean = df['month_income'].mean()
    df['month_income'].fillna(month_income_mean, inplace=True)

    # 5. 选择特征和目标变量
    # 选择特征列和目标列
    feature_cols = ['history_debit', 'debit_times', 'degree', 'month_income', 'sex', 'house_flag']
    X = df[feature_cols]
    y = df['customer_value']
    # 6. 数据切分(70%训练,30%测试)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    # 7. 模型训练
    model = LinearRegression()
    model.fit(X_train, y_train)
    # 8. 预测与评估
    y_pred = model.predict(X_test)
    # 5. 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    report = classification_report(y_test, y_pred)

    print("模型准确率:", accuracy)
    print("分类报告:")
    print(report)

2、逻辑回归模型

逻辑回归(Logistic Regression)是线性回归的一种扩展,主要用来处理分类模型 ,因其简单有效、可解释性强的特点,目前在多行业中被广泛应用。

逻辑回归的本质,是将线性回归模型(-∞,+∞)通过Sigmoid()函数(也称Logistic函数) 进行了非线性转换,从而得到一个介于(0,1)之间的概率值,从而实现分类的效果。

sigmoid函数代码实现:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    """Sigmoid 激活函数"""
    return 1 / (1 + np.exp(-x))

if __name__ == '__main__':
    # 可视化 Sigmoid 函数
    x = np.linspace(-10, 10, 100)
    plt.plot(x, sigmoid(x))
    plt.grid()
    plt.title('Sigmoid Function')
    plt.xlabel('Input')
    plt.ylabel('Output')
    plt.show()

2.1、分类与回归的区别

回归模型:用于对连续变量进行预测,如预测收入范围、房价变化、客户价值等,线性回归就是一种典型的回归模型。

分类模型:用于对离散变量进行预测,分类模型预测的变量不是连续的,而是离散的一些类型。例如,使用常见的二分类模型,预测客户是否违约、客户是否会流失、肿瘤是良性还是恶性等。

2.2、经典案例

这是一个经典的二分类数据集,其目标是根据乳腺肿瘤的显微图像特征来诊断肿瘤是恶性(Malignant)还是良性(Benign)

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

if __name__ == '__main__':
    # 1. 加载数据
    X, y = load_breast_cancer(return_X_y=True)
    # 2. 数据切分
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=0
    )
    # 3. 数据标准化
    mu = X_train.mean(axis=0)
    sigma = X_train.std(axis=0) + 1e-9
    X_train = (X_train - mu) / sigma
    X_test = (X_test - mu) / sigma
    # 4. 模型训练
    lr = LogisticRegression()
    lr.fit(X=X_train, y=y_train)
    # 5. 预测与评估
    y_pred = lr.predict(X=X_test)
    accuracy = (y_pred == y_test).mean()
    print(f"准确率: {accuracy:.4f}")
    # 查看模型参数
    print(f"权重数量: {lr.coef_.shape}")
    print(f"偏置项: {lr.intercept_}")

2.3、实战案例

案例:信用卡客户流失预警模型

客户流失预警模型可以用于预测客户未来的流失情况。针对流失概率较大的客户,可以采取适当的措施进行挽留,有效降低客户的流失率。根据案例数据集,完成以下功能:

|-------|---------|------|----|----|----------|-----------|-----------|-----------|------|
| 用户ID | 账户金额(元) | 用户年龄 | 学历 | 性别 | 最后一次交易时间 | 上月交易佣金(元) | 累计交易佣金(元) | 使用信用卡年限(年 | 是否流失 |
| 10011 | 52000 | 32 | 本科 | 难 | 2025/6/2 | 232.21 | 3500 | 5 | 0 |

1、结合信用卡客户流失数据,构建逻辑回归模型(分类)

2、结合已有的数据判断模型预测准确性,查看每名客户的预估流失概率

python 复制代码
import pandas as pd
from datetime import datetime
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

if __name__ == '__main__':
    # 1. 加载数据
    df = pd.read_csv("credit_data.csv", skiprows=1)
    # 2. 查看原始数据信息
    print("原始数据前10行:")
    print(df.head(10))
    print("\n数据信息:")
    print(df.info())
    print("缺失值统计:")
    print(df.isnull().sum())

    # 3. 找出存在null值的行
    null_rows = df[df.isnull().any(axis=1)]
    print("\n存在缺失值的行:")
    print(null_rows)

    # 4. 数据预处理
    # 4.1. 删除行:删除amount为null的行
    df = df.dropna(subset=['amount'])
    # 4.2. 均值填充:将age为null的使用均值填充
    age_mean = df['age'].mean()
    df['age'].fillna(age_mean, inplace=True)
    # 4.3. 缺失值填充:将degree为null的使用"本科"填充
    df['degree'].fillna('本科', inplace=True)
    # 4.4. 删除列:userId列(与训练无关列),axis=1 表示删除列
    df = df.drop('userId', axis=1)
    # 4.5.特征工程:性别编码(男=0, 女=1)
    df['sex'] = df['sex'].map({'男': 0, '女': 1})
    current_date = datetime.now()
    # 4.6 最后一次交易时间处理为距现在时间的天数
    df['last_txn_time'] = pd.to_datetime(df['last_txn_time'])
    df['days_since_last_txn'] = (current_date - df['last_txn_time']).dt.days
    # 4.7 对学历进行one-hot编码,并避免多重共线性(删除基准类别"本科")
    degree_dummies = pd.get_dummies(df['degree'], prefix='degree')
    if 'degree_本科' in degree_dummies.columns:
        degree_dummies = degree_dummies.drop('degree_本科', axis=1)
    # axis=1,指定df,degree_dummies
    df = pd.concat([df, degree_dummies], axis=1)

    # 5. 选择特征和目标变量
    # 选择特征列和目标列
    feature_cols = ['amount', 'age', 'last_month_kickback', 'accu_kickback', 'used_limit', 'days_since_last_txn', 'sex']
    X = df[feature_cols + degree_dummies.columns.tolist()]
    y = df['loss_flag']
    # 6. 数据切分(70%训练,30%测试)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    # 7. 模型训练
    model = LogisticRegression(random_state=42)
    model.fit(X_train, y_train)
    # 8. 预测与评估
    y_pred = model.predict(X_test)
    # 5. 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    report = classification_report(y_test, y_pred)

    print("模型准确率:", accuracy)
    print("分类报告:")
    print(report)
相关推荐
风象南21 分钟前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
Mintopia1 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮2 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬2 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia2 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区2 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两5 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232555 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源