跳转至

用于回归的机器学习

——解决回归问题的线性回归-汽车价格预测

(一) 探索性数据分析

——Exploratory Data Analysis, EDA · 目标变量的分布 · 此数据集的特征 · 这些特征值的分布 · 数据质量 · 缺失值的数量

1 数据处理-所有列名小写并用下划线代替空格

df.columns = df.columns.str.lower().str.replace(' ', '_')

.str.lower().str.replace(' ', '_') 可以组合使用,这是因为 Pandas 提供了一个强大的字符串操作接口,允许我们在一个链式调用中连续应用多个字符串方法。

#.replace()

Series.str.replace(pat, repl, n=-1, case=True, regex=True)

  • pat: 要替换的子字符串或正则表达式。
  • repl: 用于替换的字符串。
  • n: 最多替换的次数,默认为 -1 表示替换所有匹配项。
  • case: 是否区分大小写,默认为 True。
  • regex: 是否将 pat 作为正则表达式处理,默认为 True。

2 数据处理-选择带有字符串值的列

string_columns = list(df.dtypes[df.dtypes == 'object'].index)
  1. df.dtypes: 获取DataFrame中每个列的类型。
import pandas as pd
# 创建一个示例DataFrame
data = {
    'name': ['John', 'Jane'],
    'age': [28, 34],
    'city': ['New York', 'Los Angeles']
}
df = pd.DataFrame(data)
print(df.dtypes)

输出:

name    object
age      int64
city    object
dtype: object

df.dtypes 返回一个Series,其中索引是列名,值是列的数据类型。

  1. df.dtypes == 'object': 创建一个布尔Series,用于标识哪些列的数据类型为 object
is_object = df.dtypes == 'object'
print(is_object)

输出:

name     True
age     False
city     True
dtype: bool

这个布尔Series表明哪些列的数据类型是 object(即字符串类型)。

  1. df.dtypes[df.dtypes == 'object']: 通过布尔索引过滤出数据类型为 object 的列。
object_columns = df.dtypes[df.dtypes == 'object']
print(object_columns)

输出:

name    object
city    object
dtype: object

这个Series只包含数据类型为 object 的列。

  1. .index: 获取过滤后的Series的索引,即列名。
object_column_names = object_columns.index
print(object_column_names)

输出:

Index(['name', 'city'], dtype='object')

这一步返回所有字符串列的列名。

  1. list(...): 将索引对象转换为列表。
string_columns = list(object_column_names)
print(string_columns)

输出:

['name', 'city']

最终,string_columns 是一个包含所有字符串列名的列表。

3 目标变量分析

#.histplot()

sns.histplot() 是 Seaborn 库中的一个函数,用于绘制直方图和内核密度估计图(KDE)。直方图用于显示数据分布的近似表示,是数据分析和可视化中非常常用的工具。有以下参数:

  • data: 数据集,可以是数组、列表、Pandas Series 或 DataFrame。
  • x: 指定用于绘图的变量,通常是 DataFrame 中的列名。
  • bins: 指定直方图中的柱子(bin)的数量或边界。
  • kde: 是否绘制内核密度估计图,布尔值(TrueFalse)。
  • stat: 指定直方图的统计量类型,可以是 'count''frequency''density''probability'
  • element: 指定直方图元素类型,可以是 'bars''step''poly'
  • multiple: 指定直方图的堆叠方式,可以是 'layer''dodge''stack''fill'
  • palette: 指定颜色调色板,用于多类别数据。
  • hue: 指定分组变量,用于绘制多个直方图。
#.长尾分布

长尾的分布会让我们很难看到分布,但是它对模型的影响会很大,会混淆模型,从而阻碍模型学习的足够好。解决方案是对数变换。 长尾分布:多数集中+长尾现象 对数变换:缩小范围+减小方差(接近正态)+减少极端值的影响+线性化非线性关系「??为啥」

4 检查缺失值

5 验证框架

(二)回归

1 线性回归

矩阵什么的数学知识,理解的不大深入 看书后面的附录

2 训练模型

呃,用了**标准方程(即,正规方程)**。 \(w=(X^TX)^{-1}X^Ty\)

(三)预测价格

1 缺失值处理

删掉相关行。用0代替——等同于忽略,不会影响结果。用平均值代替

2 RMSE评估模型

——Root Mean Squared Error,均方根误差 \(REMS=\sqrt{\frac{1}{m} \sum_{i=1}^{m} (g(x_i)-y_i)^2}\)

3 验证模型

不过是用验证集跑一次而已

4 分类变量

ONE-HOT编码(书翻译成“独热编码”也太搞了)

5 正则化

控制模型的权重,使其行为正确,不出现增长过大的情况 正则线性回归通常称为岭回归 一种方法是给矩阵的每个对角元素加一个小的数值,\(w=(X^TX+\alpha I)^{-1}X^Ty\) 哭哭哭哭这一领域没搞明白