predict函数 R_超星尔雅-R语言学习总结(上)

实验一 多元数据的数学表达

实验目的:

1. 会用R语言求矩阵的逆矩阵、特征根和特征向量

2. 对给定的数据会计算频数、频率和累积频率、并绘制直方图

3. 会用R语言编写进行计量数据频数表分析的程序

实验内容:

1. 用R语言求下面相关系数矩阵的逆矩阵、特征根和特征向量。

v2-44ee6b1fda10752460258baf736c07f9_b.jpg

2. 某厂对50个计件工人某月份工资进行登记,获得以下数据。按组距为300编制频数表,计算频数、频率和累计频率,并画出直方图。

v2-79eb354316a04098c17eebd7726058ca_b.png

3. 编制进行计量数据频数表分析的R语言函数。

实验要求:

1. 提交代码(*.R文件)

2. 提交执行结果截图

3. 提交电子版实验报告

执行结果图例

v2-5d2f74c3f7135409477b2c8e4f5e1afa_b.png
#创建一个矩阵

实验二 单变量线性回归

实验目的:

1. 能够根据给定数据创建单变量线性回归模型

2. 会使用线性回归模型进行预测

3. 会对预测结果进行评价

实验内容:

假设某披萨店的披萨价格和披萨直径之间有下列数据关系:

v2-eb8a95f7f9ce36771afc8c55be905b20_b.jpg

根据上面的训练数据,预测12英寸的披萨的可能售价。

1.直径为自变量X,价格为因变量y,画出二者的散点图,并给出结论。

2.根据现有的训练数据求线性回归模型,并画出拟合直线。
步骤:

准备训练数据
求线性方程斜率
求线性方程截距
显示线性回归方程
检验线性回归方程
做散点图
画拟合直线

3.预测12英寸披萨的价格。

4.评价模型的准确率,分析模型预测结果。
测试数据:

v2-a0f1695111a1cf61415a2982713cdd58_b.jpg

实验结果图:

v2-1fc633fb0a201af091f79bdf1cfcb884_b.jpg

v2-f2cb013311d13840e345f236401863a6_b.jpg

v2-7c296960054ab0c363d1515233ca9b34_b.jpg

备注:该实验数据是自己随便写的的,数据存在一定的错误,效果不是很好是可能情况。

#相关库的导入
library(readxl)
library(mvstats)

#准备训练数据

#数据导入
dia_price <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
                     , sheet = 1, col_names = T)
test <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
                        , sheet = 2, col_names = T)
model <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
                    , sheet = 3, col_names = T)
attach(dia_price)
#画出原始数据的散点图
plot(diameter, price)
#离均差计算函数
lxy <- function(x, y){
  n = length(x);
  sum(x*y) - sum(x)*sum(y)/n
}
#diameter的离均差平方和
lxy(diameter, diameter)
#price的离均差平方和
lxy(price, price)
#diameter和price的离均差乘积和
lxy(diameter, price)
#使用离均差乘积和计算的相关系数
r = lxy(diameter, price)/sqrt(lxy(diameter, diameter) * lxy(price, price))
r
#下面的是自带的相关性计算函数
cor(diameter, price)


#求线性方程斜率
b = lxy(diameter, price)/lxy(diameter, diameter)
b
#求线性方程截距
a = mean(price) - b*mean(diameter)
a
#显示线性回归方程
fm = lm(formula = price~diameter, data = dia_price)
fm
#coef.sd(fm)  用于偏回归系数
#price = 1.9655 + 0.9763*diameter 
#print(fm$coefficients)


#检验线性回归方程
#方差分析
anova(fm)
#回归系数的t检验
summary(fm)


#做散点图
plot(price~diameter, data = dia_price, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm)


#使用箱尾图来观测
boxplot(dia_price$price)

#预测12英寸披萨的价格。
a <- data.frame(diameter = 12)
result <-  predict(fm, a)
result

detach(dia_price)



attach(test)
#做散点图
t = price~diameter
plot(t, data = dia_price, main = 'Pizza Price vs Diameter')
#画拟合直线
par(new=TRUE)

#画测试数据点
points(t, data = test, col='red', pch=19, main = 'Pizza Price vs Diameter')
abline(fm)



#自定义针对该问题的误差分析函数
#输入:预测结果,真实结果,误差范围(默认为0.3)
#输出:准确度数组
acc <- function(x, y, vRan = 0.3){#默认误差为0.3
  #count = 0#记录数据个数
  index = 1#y的索引
  var = c()
  for (vx in x) {
    if(vx-vRan <= y[index] && y[index] <= vx+vRan){
      var <- append(var, TRUE)
    }else{
      var <- append(var, FALSE)
    }
    index = index+1
    #count = count+1
  }
  #result <- c(count,var)
  #names(result) <- c('count', 'varieties')
  return(var)  
}

#准确度计算
#输入:准确度数组
#输出:准确率
acccount <- function(accArr){
  count = 0#统计准确元素个数
  for (vAcc in accArr) {#遍历准确度数组
    if(vAcc){#统计TRUE的个数
      count = count + 1
    }
  }
  return(count/length(accArr))
}



#预测test中不同直径对应的价格
result_test <- predict(fm, diameter=test$diameter)
#对数据进行四舍五入,保留一位小数
result_test <- round(result_test, 1)
result_test
#精确度计算
acc_result <- acc(result_test, test$price)
acc_result
pPredict <- acccount(acc_result)
pPredict

#使用箱尾图来观测
boxplot(test$price)



detach(test)


fm2 = lm(formula = price~diameter, data = model)
fm2

#检验线性回归方程
#方差分析
anova(fm2)
#回归系数的t检验
summary(fm2)
#做散点图
plot(price~diameter, data = model, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm2)

#预测12英寸披萨的价格。
a <- data.frame(diameter = 12)
result <-  predict(fm2, a)
result


#预测test中不同直径对应的价格
result_test2 <- predict(fm2, diameter=test$diameter)
#对数据进行四舍五入,保留一位小数
result_test2 <- round(result_test2, 1)
result_test2
#精确度计算
acc_result2 <- acc(result_test2[1:5], test$price)
acc_result2
pPredict2 <- acccount(acc_result2)
pPredict2





fm3 = lm(formula = price~diameter2, data = model)
fm3

#检验线性回归方程
#方差分析
anova(fm3)
#回归系数的t检验
summary(fm3)
#做散点图
plot(price~diameter2, data = model, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm3)

#预测test中不同直径对应的价格
result_test3 <- predict(fm3, diameter2=test$diameter2)
#对数据进行四舍五入,保留一位小数
result_test3 <- round(result_test3, 1)
result_test3
#精确度计算
acc_result3 <- acc(result_test3[1:5], test$price)
acc_result3
pPredict3 <- acccount(acc_result3)
pPredict3

实验三 使用Logistic回归模型对乳腺癌数据分类

实验目的:

  1. 会使用R语言对给定的数据创建Logistic回归模型
  2. 会使用R语言对数据进行标准化处理
  3. 会用逐步变量选择法选择变量并创建模型

实验内容:

乳腺癌数据集存放了数百条检测数据和对应的诊断结果,使用Logistic回归模型对该数据进行分类,并评价模型的准确率。

数据说明:

前9列是特征属性,每个特征都已经转换成了0~10之间的整数,具体含义如下:

  • 肿块厚度
  • 细胞大小均匀性
  • 细胞形状均匀性
  • 边缘粘性
  • 单一上皮细胞大小
  • 裸核
  • Bland染色质
  • 正常细胞核
  • 有丝分裂

第10列是诊断结果,0表示良性,1表示恶性

  1. 读取数据,显示前10行数据后后10行数据
  2. 按照8:2的比例分割数据集为训练集和测试集,显示测试集和数据集的维度
  3. 使用全变量创建逻辑Logistic回归模型,显示模型表达式
  4. 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
  5. 计算并显示Logistic回归模型在训练集和验证集上的准确率
  6. 分析Logistic回归模型分类结果。
#相关库引用
library(mvstats)

#数据读取
X <- read.csv("D:自己用项目R语言课程实验三breast_cancer.csv")
X <- na.omit(X)#异常值处理
attach(X)

# 读取数据,显示前10行数据后后10行数据
head(X, n = 10)
tail(X, n = 10)

# 按照8:2的比例分割数据集为训练集和测试集,显示测试集和数据集的维度
set.seed(20180808)#设置随机种子
index <-  sort(sample(nrow(X), nrow(X)*.8))
train <- X[index,]
test <-  X[-index,]
n1 = ncol(train)
n2 = ncol(test)
print(paste("数据集的维度为",as.character(n1)))
print(paste("测试集的维度为",as.character(n2)))

# 使用全变量创建逻辑Logistic回归模型,显示模型表达式
logit.glm <- glm(y~x1+x2+x3+x4+x5+x6+x7+x8+x9, family = binomial, data = train)
summary(logit.glm)
print(paste("p = (exp(-10.07374+0.53667x1-0.02610x2+0.26239x3+0.38038x4+0.06444x5+0.41367x6+0.39594x7+0.26710x8+0.68928x9))",
            "/(1 + exp(-10.07374+0.53667x1-0.02610x2+0.26239x3+0.38038x4+0.06444x5+0.41367x6+0.39594x7+0.26710x8+0.68928x9))"))

# 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
logit.step <- step(logit.glm, direction = "both")
coef.sd(logit.step)
summary(logit.step)
print(paste("p = (exp(-9.9592+0.5326x1+0.2642x3+0.3858x4+0.4200x6+0.3948x7+0.2729x8+0.6826x9))",
            "/(1 + exp(-9.9592+0.5326x1+0.2642x3+0.3858x4+0.4200x6+0.3948x7+0.2729x8+0.6826x9))"))

# 计算并显示Logistic回归模型在训练集和验证集上的准确率

#自定义函数编写
#自定义针对该问题的误差分析函数
#输入:预测结果,真实结果
#输出:准确度数组
acc <- function(x, y){
  index = 1#y的索引
  var = c()
  for (vx in x) {
    if(vx == y[index] && y[index] == vx){
      var <- append(var, TRUE)
    }else{
      var <- append(var, FALSE)
    }
    index = index+1
  }
  return(var)  
}

#准确度计算
#输入:准确度数组
#输出:准确率
acccount <- function(accArr){
  count = 0#统计准确元素个数
  for (vAcc in accArr) {#遍历准确度数组
    if(vAcc){#统计TRUE的个数
      count = count + 1
    }
  }
  return(count/length(accArr))
}

#根据指定模型在指定数据集上进行预测的准确率
#输入:模型,数据集,预测阈值
#输出:模型预测准确率
pPredict <- function(fm, data, fac){
  p <- predict(fm, newdata = data, type = "response")
  p <- exp(p)/(1+exp(p))#计算因变量的值
  data$y_predicted=1*(p > fac)#给train增加一列,也就是对y的预测,当p>0.5时,预测值为1
  #精确度计算
  acc_result <- acc(data$y_predicted, data$y)  #计算两者的
  pPredict <- acccount(acc_result)
  pPredict  #模型预测准确率
}

fac = 0.7

# p1 <- predict(logit.step, type = "response")
# p1 <- exp(p1)/(1+exp(p1))#计算因变量的值
# train$y_predicted=1*(p1 > fac)#给train增加一列,也就是对y的预测,当p>0.5时,预测值为1
# #精确度计算
# acc_result <- acc(train$y_predicted, train$y)
# # acc_result
# pPredict <- acccount(acc_result)
# pPredict

#训练集的准确度
a1 <- pPredict(logit.step, train, fac)
a1

#测试集的准确度
pPredict(logit.step, test, fac)

#预测阈值改进
for(i in seq(0.5,0.9,0.1)){
  a2<-pPredict(logit.step, train, i)
  if(a1 < a2){  #得到最优预测阈值
    fac = i  
  }
}

#使用最终预测阈值进行预测的结果
pPredict(logit.step, test, fac)

detach(X)

实验四 使用线性判别和距离判别对数据分类

实验目的:

  1. 会用R语言的线性判别法对数据进行分类
  2. 会用R语言的距离判别法对数据进行分类
  3. 会用R语言对数据进行预处理

实验内容:

使用线性判别法和距离判别法法对income_classification.csv的收入水平进行分类。训练集和测试集的比例是7:3,选取适当的特征列,使得针对测试样本的分类准确率在80%以上,对2种分类方法的分类结果进行比较分析。

数据说明:

  • 特征列

age:年龄,整数

workclass:工作性质,字符串

education:教育程度,字符串

education_num:受教育年限,整数

maritial_status:婚姻状况,字符串

occupation:职业,字符串

relationship:亲戚关系,字符串

race:种族,字符串

sex:性别,字符串

capital_gain:资本收益,浮点数

capital_loss:资本损失,浮点数

hours_per_week:每周工作小时数,浮点数

native_country:原籍,字符串

  • 分类标签列:income

imcome > 50K

imcome ≤ 50K

  1. 读入数据并显示数据的维度和前6行数据
  2. 对连续变量年龄进行离散化,并显示前6行数据离散化后的结果
    age_bins= [20, 30, 40, 50, 60, 70]
  3. 对属性是字符串的任意特征进行数字编号处理,显示前6行编码后的结果,每个特定的字符串用一个整数来表示,整数序列从0开始增长。
  4. 对预处理后的数据用线性判别法和距离判别法分类

实验步骤:

1) 选择合适的若干特征字段

2) 按7:3划分训练集和样本集

3) 使用训练集训练一个线性判别分类器

4) 使用测试集计算线性判别分类器的分类准确率

5) 使用训练集训练一个距离判别分类器

6) 使用测试集计算距离判别分类器的分类准确率

5. 分析实验结果

#函数部分

#将不可定量计算的字符串变量转化为可定量计算的数值变量
#输入:某一列
#输出:将这一列的字符串变量转化为从0开始的整数
toTag <- function(da){
  values <- table(da)
  S <- names(values)#
  count <- length(S)#记录字符串个数
  for(j in 1:length(da)){
    for(i in 1:count){
      if (!is.na(da[j]) && !is.na(S[i])){
        if(da[j] == S[i]){
          da[j] <- i
        }
      }
    }
  }
  da
} 

#分类准确率
#输入:table形式的分类结果
#输出:准确率
groupingAccuracy <- function(tabl){
  tabl <- as.matrix(tabl)
  s <- sum(tabl)  #求出总和
  accS <- 0
  count <- ncol(tabl)  #记录列数
  for(i in 1:count){
    accS <- as.integer(tabl[i,i])+accS
    #t[i][j] t[i,j]
  }
  accS/s
}


#相关库的导入
library(MASS)
library(ggplot2)   #导入包ggplot

# 读入数据并显示数据的维度和前6行数据
X <- read.csv("D:自己用项目R语言课程实验四income_classification.csv")
#X <- na.omit(X)#异常值处理
#with(data,{...})
X <- X[,-3]
rank = ncol(X)
print(paste("数据集的维度为", as.character(rank)))
head(X, 6)

# 对连续变量年龄进行离散化,并显示前6行数据离散化后的结果0
# age_bins= [20, 30, 40, 50, 60, 70]
#查看一下分类结果
table(floor(X$age/10))
X$age = floor(X$age/10)#age代表年龄从age*10到(age+1)*10的人
head(X, 6)

# 对属性是字符串的任意特征进行数字编号处理,显示前6行编码后的结果
# 每个特定的字符串用一个整数来表示,整数序列从0开始增长。
# X$workclass <- toTag(X$workclass)
# table(unclass(X$workclass))
# class(X$workclass)
# levels(X$workclass)
# S2 <- names(table(X$education))
# toTag(X$education)
# S3 <- names(table(X$marital.status))
# S4 <- names(table(X$occupation))
# S5 <- names(table(X$relationship))
# S5 <- names(table(X$race))
# S5 <- names(table(X$sex))
# X <- as.character(X)
# X <- as.numeric(X)
#字符串变量打标签
X$workclass <- unclass(X$workclass)
X$education <- unclass(X$education)
X$marital.status <- unclass(X$marital.status)
X$occupation <- unclass(X$occupation)
X$relationship <- unclass(X$relationship)
X$race <- unclass(X$race)
X$sex <- unclass(X$sex)
X$native.country <- unclass(X$native.country)
X$income <- unclass(X$income)
#标准化处理
X<-apply(X, 2, as.numeric)
Y = scale(X)
# Y <- X
head(Y, n=6)

# 对预处理后的数据用线性判别法和距离判别法分类
# 1)  选择合适的若干特征字段
# 由于不能直接通过课余知识直接筛选出可能特征,直接按全部特征处理

# 2)  按7:3划分训练集和样本集
set.seed(180512133)#设置随机种子
index <-  sort(sample(nrow(Y), nrow(X)*.7))
train <- Y[index,]
test <-  Y[-index,]

# 3)  使用训练集训练一个线性判别分类器

# ggplot(data = Y , aes( shape = Group ,color = Group)) 
# 分类标签
grp = train[,14]
# text(Y,G)
# newG = Z$class
# cbind(grp, Z$x, newG)
# tab = table(grp,newG)
# sum(diag(prop.table(tab)))
ld = lda(train[1:nrow(train),1:13], grp)

# 4)  使用测试集计算线性判别分类器的分类准确率
Z = predict(ld, newdata = test[1:nrow(test),1:13])
t = table(test[,14], Z$class)
groupingAccuracy(t)

# 5)  使用训练集训练一个距离判别分类器
grp = train[,14]
qd = qda(train[1:nrow(train),1:13], grp)

# 6)  使用测试集计算距离判别分类器的分类准确率
Z = predict(qd, newdata = test[1:nrow(test),1:13])
t = table(test[,14], Z$class)
groupingAccuracy(t)

# 分析实验结果
# 使用全变量创建逻辑Logistic回归模型,显示模型表达式
logit.lm <- lm(income~age+workclass+education+education.num+marital.status+occupation+relationship+race+sex
                        +capital.gain+capital.loss+hours.per.week+native.country, data = as.data.frame(train))

# 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
logit.step <- step(logit.lm, direction = "both")
summary(logit.step)

# 删除workclass这个特征重新进行判别
# 5)  使用训练集训练一个距离判别分类器
train <- train[,-2]
grp = train[,13]
qd = qda(train[1:nrow(train),1:12], grp)

# 6)  使用测试集计算距离判别分类器的分类准确率
test <- test[,-2]
Z = predict(qd, newdata = test[1:nrow(test),1:12])
t = table(test[,13], Z$class)
groupingAccuracy(t)
  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值