1.前言
在简单地介绍了数据整理、数据转换、编程基础之后,终于到了建模部分。
模型的作用是提供一个简单的、低维度的数据集摘要。可以分为两种:“预测”模型,生成预测的模型;“数据发现”模型,发现数据中有趣的关系。逼格一点的名称又可以分别叫做“监督式模型”、“非监督式模型”。
探索性分析
探索性建模、数据可视化和数据转换都是EDA(Exploratory Data Analysis,探索性数据分析)的常用方法。
验证性分析
进行分析前,将数据分为:训练集/探索集(60%)、查询集(20%)、测试集(20%)。分别有什么作用呢?训练集:可对数据进行任意操作,可视化或是拟合多个模型。查询集:比较模型。测试集:只能使用一次,测试最终模型。三者对应验证性分析的三个过程:数据探索、生成假设、假设验证。
建模过程
- 定义模型族
比如,y=a1*x+a2,a1和a2为参数,改变参数可得到不同模式 - 确定拟合模型
将模型族具体化为特定模型,比如,y=3x+7
拟合模型是与数据最接近的模型,但并不是一定就是良好的模型,更不能说明这个模型是“真”的。
“所有的模型都是错误的,但有些是有用的。”
2.一个简单模型
数据如下
> sim1
# A tibble: 30 x 2
x y
<int> <dbl>
1 1 4.20
2 1 7.51
3 1 2.13
4 2 8.99
5 2 10.2
6 2 11.3
7 3 7.36
8 3 10.5
9 3 10.5
10 4 12.4
# ... with 20 more rows
原文在这一部分介绍了四种方法求最近似模型:利用均方根误差;网格搜索法;牛顿—拉夫逊搜索;lm()
lm()函数是R中专门用于拟合线性模型的工具。使用简单,且快速准确。
> sim1_lm <- lm(y ~ x, data = sim1)
> coefficients(sim1_lm)
(Intercept) x
4.220822 2.051533
3.预测
3.1生成数据网格
简单说就是求出x值的数组
> sim1 <- sim1
> grid <- sim1 %>% data_grid(x) #data_grid(sim1, x)的作用是求出sim1中x列的唯一值,相当于uniq
> grid
# A tibble: 10 x 1
x
<int>
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
3.2添加预测值
modelr::add_predictions( dataframe, result_from_lm_function )可以将模型的预测值作为新列添加到数据框中。
> grid <- grid %>% add_predictions(sim1_lm)
> grid
# A tibble: 10 x 2
x pred
<int> <dbl>
1 1 6.27
2 2 8.32
3 3 10.4
4 4 12.4
5 5 14.5
6 6 16.5
7 7 18.6
8 8 20.6
9 9 22.7
10 10 24.7
3.3绘制预测值
> ggplot(sim1,aes(x)) + geom_point(aes(y = y))+geom_line(aes(y = pred),data = grid,color = "red",size = 1)
4.残差
残差 = 预测值 - 真实值
4.1添加残差
> sim1 <- sim1 %>% add_residuals(sim1_lm)
> sim1
# A tibble: 30 x 3
x y resid
<int> <dbl> <dbl>
1 1 4.20 -2.07
2 1 7.51 1.24
3 1 2.13 -4.15
4 2 8.99 0.665
5 2 10.2 1.92
6 2 11.3 2.97
7 3 7.36 -3.02
8 3 10.5 0.130
9 3 10.5 0.136
10 4 12.4 0.00763
# ... with 20 more rows
4.2残差的分布
> ggplot(sim1,aes(resid)) + geom_freqpoly(binwidth = 0.5)
理想情况下,残差的平均值为0,因此中间占比高。
使用残差代替y值重新绘图:
> ggplot(sim1,aes(x,resid)) + geom_ref_line(h = 0)+geom_point() + geom_abline(aes(intercept = 0, slope = 0), color = "red")
这张图是理想的,因为点随机分布,表明模型拟合较好。