数据处理与拟合模型
来源datawhale的学习地址:
https://datawhalechina.github.io/intro-mathmodel/#/
1.数据与大数据
数据不同形式称之为“模态”,包括: | 变成计算机利用的"数据" |
---|---|
数值类数据 | 如excel,用pandas直接读取 |
文本类数据 | 文本变为数据,词频统计、TF-IDF、词嵌入等操作 |
图像类数据 | 图像变为数据,以RGB三个通道的大矩阵在存储每个像素点的颜色信息 |
音频类数据 | 音频可以看作波形 |
信号类数据 | 信号类同样看作波形(用信号与系统的概念和方法也可以对其“数化” ) |
2. 数据的预处理
2.1 数据预处理
背景:原始数据往往会出现混乱和不全面大情况,而模型又需要有效识别并提取信息。所以要尽可能对数据进行预处理,加强最后效果的上限。
表现:
数据出现的问题 | ||
---|---|---|
数据量不够 | 如:收集到很少的图片 | 尝试裁剪,旋转,平移或缩放图像,或加噪点,模糊,改变颜色或阻挡部分噪音,来增加数据量 |
数据的错误 | 如:2月不能有30号 | 去除数据,或者修改为None |
数据不全面 | 如:excel出现空缺,或None | 删除、均值、众数插补,或通过其他数据拟合补充 |
2.2 使用pandas处理数据的基础
(1) 缺失率的处理技巧
- 1.数据项占比较少,在5%以内:如果问题允许可以把行删掉。
- 2.缺失率稍微高,在5%-20%:使用填充(常数填充、均值填充)、插值的方法。
- 3.缺失率还高一些,在20%-40%:用预测方法例如机器学习去填充缺失数据了。
- 4.如果一行数据有50%以上都是缺失的,如果条件允许,可以把这一列都删掉(当然凡事都有例外,见机行事)。
(2) pandas对数据的处理
df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm',
'Budapest_PaRis', 'Brussels_londOn'],
'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],
'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],
'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )',
'12. Air France', '"Swiss Air"']})
pandas对数据的操作 | |
---|---|
FlightNumber列中有某些缺失值。(缺失值常用nan表示) | 填充缺失值: df[‘FlightNumber’].interpolate().astype(int) |
将列From_To拆分成两列,并赋予为列From与To | 先将列中的值分开,再赋列名: temp = df[‘From_To’].str.split(“_”, expand=True) temp.columns = [‘From’, ‘To’] |
将首字母转大写形式 | temp[‘From’] = temp[‘From’].str.capitalize() |
列去除与列添加 | df.drop(‘xx’, axis=1, inplace=True) df[[‘From’, ‘To’]] = temp |
清除列中的特殊字符 | df[‘‘Airline’’].str.extract(r’([a-zA-Z\s]+)', expand=False).str.strip() |
将列表中的值变成列 | delays = df[‘RecentDelays’].apply(pd.Series) delays.columns = [‘delay_%s’ % i for i in range(1, len(delays.columns)+1)] df = df.drop(‘RecentDelays’, axis=1).join(delays, how=‘left’) |
将列中的nan都填为自身的平均值 | for i in range(1, 4): df[f’delay_{i}‘] = df[f’delay_{i}’].fillna(np.mean(df[f’delay_{i}'])) |
添加行,其值与FlightNumber=10085保持一致 | df = df._append(df.loc[df[‘FlightNumber’] == 10085, :], ignore_index=True) |
对df的行进行去重 | df = df.drop_duplicates() |
最后的结果:
2.3 数据的规约
背景:由于数据可能偏大,或偏小,造成模型训练的不准确,所以要对数据进行归一化。
两个比较典型的规约方式:min-max规约和Z-score规约
(1) min-max规约
将数据归一化到[0,1]范围内,当出现异常值,如非常非常大的值时,数据的分布会有偏。
x
n
e
w
=
x
−
m
i
n
(
x
)
m
a
x
(
x
)
−
m
i
n
(
x
)
x_{new}=\frac{x-min(x)}{max(x)-min(x)}
xnew=max(x)−min(x)x−min(x)
(2) Z-score规约
将一列数据减去其均值再除以标准差,如果这一列数据近似服从正态分布,这个过程就是化为标准正态分布的过程
x
n
e
w
=
x
−
x
‾
s
t
d
(
x
)
x_{new}=\frac{x-\overline{x}}{std(x)}
xnew=std(x)x−x
Z-score规约和min-max规约往往不是二者取其一,有时候两个可以组合起来用。
3 常见的统计分析模型
3.1 回归分析与分类分析
回归分析与分类分析都是一种基于统计模型的统计分析方法,研究因变量与自变量之间存在的潜在关系。
回归分析 | 用于预测连续变量。如预测工资、销售额等。 |
---|---|
输出 | 一个连续的数值 |
常见算法 | 线性回归、岭回归、Lasso回归、决策树回归、随机森林回归等 |
采用评估指标 | 均方误差(MSE)、均方根误差(PMSE)、平均绝对误差(MAE)、 R 2 R^2 R2(决定系数)等 |
分类分析 | 用于预测类别标签。例如,垃圾邮件分类、图像识别中的物体分类等 |
---|---|
输出 | 一个离散的类别标签 |
常见算法 | 逻辑回归、支持向量机(SVM)、k近邻(KNN)、决策树、随机森林、朴素贝叶斯、神经网络等 |
常用评估指标 | 准确率、精确率、召回率、F1分数、ROC曲线、AUC等 |
1)回归分析:我们想分析大学成绩GPA是否与入学成绩以及高考成绩有关?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
from IPython.display import display
import statsmodels.api as sm
# 加载数据
gpa1=pd.read_stata('./data/gpa1.dta')
# 在数据集中提取自变量(ACT为入学考试成绩、hsGPA为高考成绩)
X1=gpa1.ACT
X2=gpa1[['ACT','hsGPA']]
# 提取因变量
y=gpa1.colGPA
# 为自变量增添截距项
X1=sm.add_constant(X1)
X2=sm.add_constant(X2)
display(X2)
# 拟合两个模型
gpa_lm1=sm.OLS(y,X1).fit()
gpa_lm2=sm.OLS(y,X2).fit()
# 输出两个模型的系数与对应p值
p1=pd.DataFrame(gpa_lm1.pvalues,columns=['pvalue'])
c1=pd.DataFrame(gpa_lm1.params,columns=['params'])
p2=pd.DataFrame(gpa_lm2.pvalues,columns=['pvalue'])
c2=pd.DataFrame(gpa_lm2.params,columns=['params'])
display(c1.join(p1,how='right'))
display(c2.join(p2,how='right'))
2)分类分析:我们想研究被ST的公司其背后的因素,并尝试通过利用公司的财务指标提前预测某上市公司在未来是否会被ST。
(交易所会标记该公司股票为ST,因变量就是公司是否会被ST。自变量是一些财务指标,如ARA、ASSET等)
# 加载基础包
import pandas as pd
import numpy as np
import statsmodels.api as sm
from scipy import stats
# 读取数据
ST=pd.read_csv('./data/ST.csv')
ST.head()
st_logit=sm.formula.logit('ST~ARA+ASSET+ATO+ROA+GROWTH+LEV+SHARE',data=ST).fit()
print(st_logit.summary())
3.2 假设检验
图片来源:Flyinggg_love
假设检验的本质:根据样本信息与已知信息,对一个描述总体性质的命题进行“是或否”的检验与回答。即:假设检验验证的不是样本本身的性质,而是样本所在总体的性质。
假设检验的基本步骤如下:
(假设检验的核心思想是通过样本数据来检验关于总体的某个假设是否成立。)
假设检验大体上可分为两种:参数假设检验与非参数假设检验。 | |
---|---|
1.提出假设: | 原假设(H₀):通常表示无效的假设。 备择假设(H₁或Ha):通常表示有效的假设,即认为原假设不成立。 |
2.选择显著性水平(α) | 通常设定为 0.05 或 0.01,表示在原假设为真的情况下,拒绝原假设的概率。 |
3.计算检验统计量 | 根据样本数据计算检验统计量,如 t 统计量、z 统计量、卡方统计量等 |
4.确定临界值或计算 p 值 | 根据显著性水平和检验统计量的分布确定临界值,或者直接计算 p 值 |
5.作出决策 | p 值法:如果 p 值小于显著性水平(α),则拒绝原假设;否则,不拒绝原假设。 临界值法:如果检验统计量落在临界区域,则拒绝原假设;否则,不拒绝原假设 |
例题:
设本次考试的考生成绩服从正太分布,从中水机抽取36位考生的成绩,算得平均成绩为66.5分,标准差为15分。问在显著性水平0.05下,是否可以认为这次考试全体考生的平均成绩为70分?并给出检验过程。
1.提出假设: | 原假设(H₀):考生平均分
u
=
70
u=70
u=70。 备择假设(H₁或Ha): u ≠ 70 u\neq70 u=70。 |
2.选择显著性水平(α) | 通显著性水平:α = 0.05。 |
3.计算检验统计量 | 已知:n=36,u=70,标准差S=15,均值
x
‾
=
66.5
\overline{x}=66.5
x=66.5, 根据
u
≠
70
u\neq70
u=70: T = x ‾ − u S n = t ( n − 1 ) = t ( 35 ) T=\frac{\overline{x} - u}{S\sqrt{n}} = t(n-1) = t(35) T=Snx−u=t(n−1)=t(35) |
4.确定临界值或计算 p 值 | ![]() |
5.作出决策 |
T
‾
=
66.5
−
70
15
/
6
=
−
3.5
2.5
=
−
1.4
∉
W
\overline{T} = \frac{66.5-70}{15/6}=\frac{-3.5}{2.5}=-1.4\not\in{W}
T=15/666.5−70=2.5−3.5=−1.4∈W 其位于拒绝域内,所以拒接 H 1 H_1 H1,接收 H 0 H_0 H0,即考生平均分u=70。 |
3.3 随机过程与随机模拟
随机过程就是在随机变量的基础上加入了时间维度(值得注意的是,时间维度不是随机变量,只是普通变量).
随机模拟(Stochastic Simulation)是一种通过生成随机数和随机变量来模拟复杂系统或过程的方法。它可以用于分析和预测系统的行为,特别是在不确定性和随机性占主导地位的情况下。