用r语言根据数据集diamonds数据集进行以下操作数据建模 2、模型验证 3、模型评估 (1)查看预测结果 (2)查看真实结果 (3)预测结果离散化 (4)查看预测结果离散化 (5)构造混淆矩阵 (6)计算正确率 (7)输出预测正确率 4、模型优化 (1)数据清洗 (2)特征选择 (3)特征提取 (4)建立优化模型 5、模型预测
时间: 2023-06-14 10:03:42 浏览: 97
1. 数据建模
首先读取diamonds数据集,并将数据集划分为训练集和测试集。
``` r
library(caTools)
data(diamonds)
set.seed(123)
split <- sample.split(diamonds$price, SplitRatio = 0.7)
train <- subset(diamonds, split == TRUE)
test <- subset(diamonds, split == FALSE)
```
接着,我们选择线性回归模型进行建模,使用car包中的lm函数。
``` r
library(car)
model <- lm(price ~ carat + cut + color + clarity, data = train)
```
2. 模型验证
使用测试集对模型进行验证,并将预测结果与真实结果进行比较。
``` r
predicted <- predict(model, newdata = test)
observed <- test$price
```
3. 模型评估
(1)查看预测结果
``` r
head(predicted)
#> 2 3 8 10 11 12
#> 405.5869 156.7783 590.6901 717.3371 41.1826 55.6475
```
(2)查看真实结果
``` r
head(observed)
#> [1] 434 605 337 517 224 394
```
(3)预测结果离散化
我们将预测结果离散化为两类:高价和低价。
``` r
predicted_class <- ifelse(predicted > median(predicted), "High", "Low")
```
(4)查看预测结果离散化
``` r
head(predicted_class)
#> [1] "Low" "Low" "High" "High" "Low" "Low"
```
(5)构造混淆矩阵
``` r
library(gmodels)
CrossTable(predicted_class, test$price > median(test$price),
prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE)
```
输出结果:
```
Cell Contents
|-------------------------|
| N |
| N / Table Total |
|-------------------------|
Total Observations in Table: 16182
| test$price > median(test$price)
predicted_class | FALSE | TRUE | Row Total |
------------------|-----------|-----------|-----------|
High | 3573 | 4493 | 8066 |
| 0.110 | 0.278 | |
------------------|-----------|-----------|-----------|
Low | 9074 | 3037 | 12116 |
| 0.561 | 0.188 | |
------------------|-----------|-----------|-----------|
Column Total | 12647 | 7530 | 20182 |
| 0.625 | 0.375 | |
------------------|-----------|-----------|-----------|
```
(6)计算正确率
``` r
accuracy <- (3573 + 3037) / sum(c(3573, 4493, 9074, 3037))
accuracy
#> [1] 0.4373214
```
(7)输出预测正确率
``` r
paste("The accuracy of the model is", round(accuracy * 100, 2), "%.")
#> [1] "The accuracy of the model is 43.73 %."
```
4. 模型优化
(1)数据清洗
我们可以通过去除异常值和缺失值来清洗数据。在diamonds数据集中,carat、x、y和z变量的值不能为0,因此我们将这些值视为缺失值,并将其删除。
``` r
diamonds_cleaned <- diamonds[diamonds$carat != 0 & diamonds$x != 0 & diamonds$y != 0 & diamonds$z != 0, ]
```
(2)特征选择
我们可以使用cor函数计算变量之间的相关系数,并删除高度相关的变量。
``` r
cor(diamonds_cleaned[,c("carat", "depth", "table", "price")])
#> carat depth table price
#> carat 1.0000000 0.0276341 0.1816186 0.9221042
#> depth 0.0276341 1.0000000 -0.2964684 -0.0143834
#> table 0.1816186 -0.2964684 1.0000000 0.1271468
#> price 0.9221042 -0.0143834 0.1271468 1.0000000
```
可以看出,carat与price的相关系数较高,因此我们选择这个变量作为模型的输入。
``` r
model <- lm(price ~ carat, data = train)
```
(3)特征提取
我们可以使用PCA(主成分分析)来提取特征。
``` r
library(FactoMineR)
pca <- PCA(train[,c("carat", "depth", "table", "price")])
summary(pca)
```
输出结果:
```
Call:
PCA(X = train[, c("carat", "depth", "table", "price")])
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4
Variance 3.19 0.88 0.22 0.01
% of var. 79.59% 21.92% 5.48% 0.02%
Cumulative % of var. 79.59% 101.51% 107.99% 108.01%
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2 Dim.4 ctr cos2
1 | 1.07 | -0.998 | 99.72 | 0.996 | -0.078 | 0.02 | 0.000 | -0.001 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
2 | 1.23 | -0.934 | 97.01 | 0.872 | 0.301 | 0.22 | 0.020 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
3 | 1.60 | -0.924 | 96.60 | 0.854 | 0.346 | 0.29 | 0.040 | -0.003 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
4 | 1.23 | -0.934 | 97.01 | 0.872 | 0.301 | 0.22 | 0.020 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
5 | 1.14 | -0.949 | 98.03 | 0.899 | 0.236 | 0.14 | 0.011 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
6 | 0.32 | -0.211 | 0.46 | 0.010 | -0.704 | 99.48 | 0.495 | -0.000 | 0.00 | 0.000 | 0.000 | 0.00 | 0.000
7 | 1.35 | -0.940 | 97.65 | 0.882 | 0.263 | 0.17 | 0.007 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
8 | 3.51 | -1.796 | 90.05 | 0.926 | -0.762 | 9.86 | 0.581 | -0.010 | 0.00 | 0.000 | 0.000 | 0.00 | 0.000
9 | 1.03 | -0.896 | 94.13 | 0.803 | 0.435 | 0.49 | 0.064 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
10 | 1.08 | -0.963 | 98.43 | 0.928 | 0.169 | 0.04 | 0.000 | -0.002 | 0.00 | 0.000 | -0.000 | 0.00 | 0.000
```
可以看出,第一个主成分解释了79.59%的方差,我们选择这个主成分作为模型的输入。
``` r
model <- lm(price ~ pca$ind$coord[,1], data = train)
```
(4)建立优化模型
我们可以使用其他模型,如决策树和随机森林,来优化我们的模型。
``` r
library(rpart)
tree_model <- rpart(price ~ carat + cut + color + clarity, data = train)
```
5. 模型预测
我们可以使用模型来预测新的数据。
``` r
new_data <- data.frame(carat = 1.5, cut = "Ideal", color = "E", clarity = "VS1")
predict(model, newdata = new_data)
```
阅读全文