数据挖掘的定义
1.技术上的定义及含义
数据挖掘(Data Mining)就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。这个定义包括好几层含义:数据源必须是真实的、大量的、含噪声的;发现的是用户感兴趣的知识;发现的知识要可接受、可理解、可运用;并不要求发现放之四海皆准的知识,仅支持特定的发现问题。
与数据挖掘相近的同义词有数据融合、人工智能、商务智能、模式识别、机器学习、知识发现、数据分析和决策支持等。
----何为知识?从广义上理解,数据、信息也是知识的表现形式,但是人们更把概念、规则、模式、规律和约束等看作知识。人们把数据看作是形成知识的源泉,好像从矿石中采矿或淘金一样。原始数据可以是结构化的,如关系数据库中的数据;也可以是半结构化的,如文本、图形和图像数据;甚至是分布在网络上的异构型数据。发现知识的方法可以是数学的,也可以是非数学的;可以是演绎的,也可以是归纳的。发现的知识可以被用于信息管理,查询优化,决策支持和过程控制等,还可以用于数据自身的维护。因此,数据挖掘是一门交叉学科,它把人们对数据的应用从低层次的简单查询,提升到从数据中挖掘知识,提供决策支持。在这种需求牵引下,汇聚了不同领域的研究者,尤其是数据库技术、人工智能技术、数理统计、可视化技术、并行计算等方面的学者和工程技术人员,投身到数据挖掘这一新兴的研究领域,形成新的技术热点。
这里所说的知识发现,不是要求发现放之四海而皆准的真理,也不是要去发现崭新的自然科学定理和纯数学公式,更不是什么机器定理证明。实际上,所有发现的知识都是相对的,是有特定前提和约束条件,面向特定领域的,同时还要能够易于被用户理解。最好能用自然语言表达所发现的结果。
2.商业角度的定义
数据挖掘是一种新的商业信息处理技术,其主要特点是对商业数据库中的大量业务数据进行抽取、转换、分析和其他模型化处理,从中提取辅助商业决策的关键性数据。
简而言之,数据挖掘其实是一类深层次的数据分析方法。数据分析本身已经有很多年的历史,只不过在过去数据收集和分析的目的是用于科学研究,另外,由于当时计算能力的限制,对大数据量进行分析的复杂数据分析方法受到很大限制。现在,由于各行业业务自动化的实现,商业领域产生了大量的业务数据,这些数据不再是为了分析的目的而收集的,而是由于纯机会的(Opportunistic)商业运作而产生。分析这些数据也不再是单纯为了研究的需要,更主要是为商业决策提供真正有价值的信息,进而获得利润。但所有企业面临的一个共同问题是:企业数据量非常大,而其中真正有价值的信息却很少,因此从大量的数据中经过深层分析,获得有利于商业运作、提高竞争力的信息,就像从矿石中淘金一样,数据挖掘也因此而得名。
因此,数据挖掘可以描述为:按企业既定业务目标,对大量的企业数据进行探索和分析,揭示隐藏的、未知的或验证已知的规律性,并进一步将其模型化的先进有效的方法。
数据挖掘的功能
数据挖掘通过预测未来趋势及行为,做出前摄的、基于知识的决策。数据挖掘的目标是从数据库中发现隐含的、有意义的知识,主要有以下五类功能。
1、自动预测趋势和行为
数据挖掘自动在大型数据库中寻找预测性信息,以往需要进行大量手工分析的问题如今可以迅速直接由数据本身得出结论。一个典型的例子是市场预测问题,数据挖掘使用过去有关促销的数据来寻找未来投资中回报最大的用户,其它可预测的问题包括预报破产以及认定对指定事件最可能作出反应的群体。
2、关联分析
数据关联是数据库中存在的一类重要的可被发现的知识。若两个或多个变量的取值之间存在某种规律性,就称为关联。关联可分为简单关联、时序关联、因果关联。关联分析的目的是找出数据库中隐藏的关联网。有时并不知道数据库中数据的关联函数,即使知道也是不确定的,因此关联分析生成的规则带有可信度。
3、聚类
数据库中的记录可被化分为一系列有意义的子集,即聚类。聚类增强了人们对客观现实的认识,是概念描述和偏差分析的先决条件。聚类技术主要包括传统的模式识别方法和数学分类学。80年代初,Mchalski提出了概念聚类技术牞其要点是,在划分对象时不仅考虑对象之间的距离,还要求划分出的类具有某种内涵描述,从而避免了传统技术的某些片面性。
4、概念描述
概念描述就是对某类对象的内涵进行描述,并概括这类对象的有关特征。概念描述分为特征性描述和区别性描述,前者描述某类对象的共同特征,后者描述不同类对象之间的区别。生成一个类的特征性描述只涉及该类对象中所有对象的共性。生成区别性描述的方法很多,如决策树方法、遗传算法等。
5、偏差检测
数据库中的数据常有一些异常记录,从数据库中检测这些偏差很有意义。偏差包括很多潜在的知识,如分类中的反常实例、不满足规则的特例、观测结果与模型预测值的偏差、量值随时间的变化等。偏差检测的基本方法是,寻找观测结果与参照值之间有意义的差别。
蒙特卡洛
各类常用统计分布蒙特卡洛模拟数据生成的大致思路:
1、构造自变量x的均匀分布
2、根据对应分布的均值函数,构造x变量对应的均值。(广义线性模型的link 函数参考https://en.wikipedia.org/wiki/Generalized_linear_model#Link_function)
3、将均值代入,R中对应分布的随机变量生成函数,得到因变量y(例如正态分布为rnorm、泊松分布为rpois)
#生成多元正态数据,使用MASS 包中的mvrnorm()函数,其格式为mvrnorm(n, mean, sigma),
其中n 是你想要的样本大小,mean 为均值向量,而sigma 是方差—协方差矩阵(或相关矩阵)
library("MASS", lib.loc="C:/Program Files/Microsoft/R Open/R-3.4.0/library")
?mvrnorm
n=100
alpha=c()
for(i in 1:1000)
{
mu1=c(0,0)
sigma1=matrix(c(1,0.5,0.5,1.25),nrow=2)
rand1=mvrnorm(n=100,mu=mu1,Sigma=sigma1)
X=rand1[,1]
Y=rand1[,2]
alpha[i]=(var(Y)-cov(X,Y))/(var(X)+var(Y)-2*cov(X,Y)) #cov函数计算的是列与列的协方差
#协方差是统计学上表示两个随机变量之间的相关性,随机变量ξ的离差与随机变量η的离差的乘积的数学期望叫做随机变量ξ与η的协方差(也叫相关矩),记作cov(ξ, η):
}
alpha
mean(alpha)
var(alpha)
sqrt(var(alpha))
8.自助法
自助法(Bootstrap Method,Bootstrapping或自助抽样法)是一种从给定训练集中有放回的均匀抽样,也就是说,每当选中一个样本,它等可能地被再次选中并被再次添加到训练集中。
自助法,即从初始样本重复随机替换抽样,生成一个或一系列待检验统计量的经验分布,无需假设一个特定的理论分布,便可生成统计量的置信敬意,并能检验统计假设。
倘若假设均值的样本分布不是正态分布,可使用自助法:
(1) 从样本中随机选择10个观测,抽样后再放回。有些观测可能会被选择多次,有些可能一直都不会被选中;
(2) 计算并记录样本均值;
(3) 重复1和2一千次;
(4) 将1000个样本均值从小到大排序;
(5) 找出样本均值2.5%和97.5%的分位点,此时即初始位置和最末位置的第25个数,它们就限定了95%的置信区间。
样本均值很可能服从正态分布,自助法优势不太明显;但若不服从正态分布,自助法优势 十分明显。
{
label=c(1:100)
rand=cbind(rand1,label)
lab=sample(c(1:100),1,replace=TRUE)
ran=rand1[label==lab,]
for(j in 1:99)
{
lab=sample(c(1:100),1,replace=TRUE)
ran2=rand1[label==lab,]
ran=rbind(ran,ran2)
}
X=ran[,1]
Y=ran[,2]
alpha[j]=(var(Y)-cov(X,Y))/(var(X)+var(Y)-2*cov(X,Y))
}
rand1[sample(c(1:100),100,replace=TRUE),]
523
d= read.csv("train.csv",header=TRUE)
dc= d[complete.cases(d),] #处理缺失值/空值
hist(d$y)
d0=d[d$y==0,]
d1=d[d$y==1,]
d2=d[d$y==2,]
d3=d[d$y==3,]
label0=sample(c(1:10),dim(d0[1]),replace=TRUE)
label1=sample(c(1:10),dim(d1[1]),replace=TRUE)
label2=sample(c(1:10),dim(d2[1]),replace=TRUE)
label3=sample(c(1:10),dim(d3[1]),replace=TRUE)
d0_train=d0[label0<=5,]
d0_test=d0[label0>5,]
d1_train=d1[label1<=5,]
d1_test=d1[label1>5,]
d2_train=d2[label2<=5,]
d2_test=d2[label2>5,]
d3_train=d3[label3<=5,]
d3_test=d3[label3>5,]
d_train=rbind(d0_train,d1_train,d2_train,d3_train)
d_test=rbind(d0_test,d1_test,d2_test,d3_test)
逻辑回归
library(nnet)
re_log=multinom(y~.-id,data=d_train)
pred_log=predict(re_log,newdata=d_test)
summary(pred_log)
tab_log=table(d_test$y,pred_log)
tab_log
ID3
library(rpart)
re_id3=rpart(y~.-id,data=d_train,method="class",parms=list(split="information"))
re_CART=rpart(y~.-id,data=d_train,method="class",parms=list(split="gini"),control=rpart.control(cp=0.0001))
min=which.min(re_CART$cptable[,4])
剪枝
re_CART_f=prune(re_CART,cp=re_CART$cptable[min,1])
pred_id3=predict(re_id3,newdata=d_test,type="class")
pred_id3
table(d_test$y,pred_id3)
pred_CART=predict(re_CART_f,newdata=d_test,type="class")
table(d_test$y,pred_CART)
plot(re_CART)
text(re_CART)
看不同cp 的分类情况
re_id3$cptable
re_CART$cptable
随机森林
d_train$y=as.factor(d_train$y)
re_rf=randomForest(y~.-id,data=d_train,ntree=5)
为了画ROA 曲线资产收益率
把所有不等于0的都当成是1
先重新运行
d_test(d0= d$y..d_test rbind)
d_train$y[d_train$y>=1]=1
d_test$y[d_test$y>=1]=1
re_rf=randomForest(y~.-id,data=d_train,ntree=5)
pred_rf=predict(re_rf,newdata=d_test,type="prob")
pred <- prediction(pred_rf[,2],d_test$y)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
84
d = read.csv("train.csv",header=TRUE)
dc = d[,2:9]
#标准化
sdc = scale(dc)
mean(sdc[,1])
#求协方差矩阵
cov_sdc=cov(sdc)
#求特征值以及其对应的特征向量
eigen(cov_sdc)
#做主成分分析
princomp(dc)
prcomp(dc)
prcomp(sdc)
d = read.csv("hmeq.csv",na.strings="") #na.strings 定义&标记哪些是空值
View(d)
dc = d[complete.cases(d),]
dim(d)
dim(dc)
#计算马氏距离清楚异常值
mdist = function(x){
t = as.matrix(x)
m = apply(t,2,mean)
s = var(t)
return(mahalanobis(t,m,s)) }
dc1 = dc[dc$BAD==1,]
dc0 = dc[dc$BAD==0,]
mdc1 = mdist(dc1[,-c(1,5,6)])
mdc0 = mdist(dc0[,-c(1,5,6)])
dim(dc1)
dim(dc0)
summary(mdc1)
summary(mdc0)
#卡方分布qchisq(p ,df 自由度)
#马氏距离和卡方分布的值做比较,取小于卡方分布的
c = qchisq(0.99,10)
x1 = dc1[mdc1
dim(x0)
x = rbind(x0,x1)
lg.fit = glm(BAD~.,data=x,family=binomial)
lg.fit$fitted.values
summary(lg.fit$fitted.values)
pred1=predict(lg.fit,type="response")
pred1-lg.fit$fitted.values
pred1[pred1>0.5] <- 1
pred1[pred1<=0.5] <- 0
summary(pred1)
table(pred1,x$BAD)
s1=table(pred1,x$BAD)
pred2=predict(lg.fit,type="response")
pred2[pred2>0.1] <- 1
pred2[pred2<=0.1] <- 0
s2=table(pred2,x$BAD)
error1=(s1[1]+s1[4])/sum(s1)
error2=(s2[1]+s2[4])/sum(s2)
P174,12
Power=function(){
print(2^3)
}
Power()
Power2=function(x,a){
print(x^a)
}
Power2(5,7)
Power2(3,8)
Power2(10,3)
Power2(8,17)
Power2(131,3)
Power3=function(x,a){
result = x^a
return(result)
}
Power3(131,3)
x = c(1:10)
y = Power3(x,2)
plot(x,y)
PlotPower=function(x,a){
y=Power3(x,a)
plot(x,y)
}
PlotPower(c(1:70),3)
PlotPower(1:70,3)
PlotPower(1:10,3)
P202,8
set.seed(1) #设定随机数种子
#rnorm()函数产生一系列的随机数,随机数个数,均值和标准差都可以设定
y = rnorm(100) #产生100个服从正态分布的随机数,均值是0,方差是1
x = rnorm(100)
y=x-2*x^2+rnorm(100)
#p是变量的个数,多少个x p=1
#n是多少行记录n=100
plot(x,y)
error=c()
d=cbind(x,y)
d= as.data.frame(d) #强制转换成数据框
for(i in 1:100)
{
m1=glm(y~x,data=d[-i,],) #model1
pred_m1=predict(m1,newdata=d[i,])
error[i]=d[i,2]-pred_m1
}
sum(error^2)
#package boot
m1r = cv.glm(data=d,glmfit=m1,K=100)
m1r$delta
m2 = glm(y~poly(x,2),data=d) #model2
m2r = cv.glm(data=d,glmfit=m2,K=100)
m2r$delta
m3 = glm(y~poly(x,3),data=d) #model3
m3r = cv.glm(data=d,glmfit=m3,K=100)
m3r$delta
m4 = glm(y~poly(x,4),data=d) #model4
m4r = cv.glm(data=d,glmfit=m4,K=100)
m4r$delta
#模型复杂度增加的时候,方差不怎么变,偏差变大
#The result are the same as what i got in (c)
#ii.
#显著和不显著结果跟模型的选择没有关系
管道:%>%
加载magrittr包
When
1:10 %>%
when(
sum(.) <= 50 ~ sum(.),
sum(.) <= 100 ~ sum(.)/2,
~ 0
)
If
num<-6
if(num%%2==0)
print("是偶数") else print("是奇数")
[1] "是偶数"
网格法:网格搜索算法是一种一种调参手段,通过遍历给定参数组合来优化模型表现的方法。其原理就像是在数组里找最大值。
#SVM网格搜索法寻找使模型最优的参数
a<-c()
for(i in 1:10){
for(j in 1:10){
for(k in 1:10){
svm.fit<-svm(rating_count_tot~.,data=da,degree=i,cost=j,gamma=k)
svm.pre<-ifelse(predict(svm.fit)>0,1,0)
n<-ifelse(svm.pre==da$rating_count_tot,1,0)
result<-c(i,j,k,sum(n))
a<-rbind(a,result)
}}}
a[which(a[,4]==max(a[,4])),]
http://www.shujuren.org/article/22.html
聚类k-means
https://blog.csdn.net/yucan1001/article/details/23123043
使用R完成Kmeans聚类需要调用kmeans方法,使用数据集iris完成一个小的聚类实验,代码如下:
newiris <- iris;
newiris$Species <- NULL; #对训练数据去掉分类标记
kc <- kmeans(newiris, 3); #分类模型训练
fitted(kc); #查看具体分类情况
table(iris$Species, kc$cluster); #查看分类概括
#聚类结果可视化
plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster, pch = as.integer(iris$Species)); #不同的颜色代表不同的聚类结果,不同的形状代表训练数据集的原始分类情况。
points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)
d1 = d[!is.na(d$pm2.5),]去掉反应变量中空值
线性回归的基本形式
lr = glm(pm2.5~., data=d1)
线性回归中自变量的形式变化
lr2 =glm(pm2.5~A,data=d1)表示仅以“A”作为自变量
lr2 =glm(pm2.5~No+TEMP,data=d1)表示以“No”和“TEMP”为自变量
lr2 =glm(pm2.5~A+I(No^3) ,data=d1) 表示以“A”和“No”的3次方为自变量
lr2 =glm(pm2.5~poly(No,6) ,data=d1)表示以”No”的1到6次方为变量。
7. 线性回归的结果
summary(lr) lr$coefficients
test = d1[d1$year==2014,]
train = d1[d1$year<=2013,]
lr3 =glm(pm2.5~.,data=train)
pre = predict(lr3,newdata=test) newdata=”是指明预~测~所使用的的新数据集
交叉验证
label= sample(c(1:10),dim(train)[1],replace=TRUE)
d3 = cbind(train,label)
sample()第一个是抽取范围,第二个是抽取次数, TRUE表示有放回。cbind按列拼接。
计算以第一组为验证,其余为建模数据时的误差
lr5 =glm(pm2.5~.,data=d3[d3$label!=1,])
pre2 =predict(lr5,newdata= d3[d3$label==1,])
error=pre2-d3[d3$label==1,]$pm2.5
mse =sum(error^2)/length(pre2)
计算交叉验证误差的均值(以10组中的一组为验证,其余建模,循环10次)
mse1 = c()
for(i in 1:10)
{
lr6 = glm(pm2.5~No,data=d3[d3$label!=i,])
pre3 = predict(lr6,newdata= d3[d3$label==i,])
error=pre3-d3[d3$label==i,]$pm2.5
mse1[i]= sum(error^2)/length(pre3)
}
mean(mse1)
考量模型中变量”No”的指数从1到15变化的15个模型,计算这15个模型对应的交叉验证误差的均值
mse2 = matrix(rep(0,150),nrow=10)
for (j in 1:15)
{
for(i in 1:10)
{
lr7 = glm(pm2.5~poly(No,j),data=d3[d3$label!=i,])
pre4 = predict(lr7,newdata= d3[d3$label==i,])
error=pre4-d3[d3$label==i,]$pm2.5
mse2[i,j]= sum(error^2)/length(pre4)
}
}
mmse1 = apply(mse2, 2, mean)
考量模型中变量”No”的指数从1到15“TEMP”的指数从1到10变化的150个模型,计算这150个模型对应的交叉验证误差的均值
mse3 = matrix(rep(0,1500),nrow=10)
for (k in 1:10)
{
for (j in 1:15)
{
for(i in 1:10)
{
lr8 = glm(pm2.5~poly(No,j)+poly(TEMP,k),data=d3[d3$label!=i,])
pre5 = predict(lr8,newdata= d3[d3$label==i,])
error=pre5-d3[d3$label==i,]$pm2.5
mse3[i,15*(k-1)+j]= sum(error^2)/length(pre5)
}
}
}
mmse2 = apply(mse3, 2, mean)
根据交叉验证误差选取最终模型,并计算测试集中的预测误差(以13中的例子为参考)
power = which.min(mmse1)
lrf = glm(pm2.5~poly(No,power),data=train)
pref = predict(lrf, newdata=test)
errorf = pref-test$pm2.5
msef = sum(errorf^2)/length(pref)