显示标签为“数据挖掘”的博文。显示所有博文
显示标签为“数据挖掘”的博文。显示所有博文

星期六, 十月 25, 2014

python贝叶斯文分类识别垃圾短信

Python贝叶斯文本分类识别垃圾短信

1、读取数据,type表示短信类别,text是短信内容

In [17]:
%pylab inline
import pandas as pd
import numpy as np
df = pd.read_csv('sms_spam.csv')
df.head()
Populating the interactive namespace from numpy and matplotlib

Out[17]:
type text
0 ham Hope you are having a good week. Just checking in
1 ham K..give back my thanks.
2 ham Am also doing in cbe only. But have to pay.
3 spam complimentary 4 STAR Ibiza Holiday or £10,000 ...
4 spam okmail: Dear Dave this is your final notice to...

2、使用sklearn包转换文本为结构化数据,将矩阵分切为训练集和检验集

CountVectorizer负责将文档转为文档词频矩阵,重要的参数有如下几个:

  • ngram_range:ngrame频率范围,如果需要识别词组的话需要设置
  • stop_words:停词列表
  • token_pattern:分词的字符模式,默认空格
  • max_df:词频上限,超过该值的词项不作为特征,即过滤常用词
  • min_df:词频下限,低于该值的词项不作为特征
  • max_features:只选择词频较高的几个作为特征
In [18]:
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(1,1),stop_words='english',lowercase=True,min_df=1)
X = vectorizer.fit_transform(df.text) 
y = (df.type == 'spam').values.astype(int)

TfidfVectorizer则可以计算tfidf值,而非仅仅文档词频矩阵

In [19]:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(ngram_range=(1,1),stop_words='english',lowercase=True,min_df=1)
X = vectorizer.fit_transform(df.text)

3、将数据切分为train和test

In [20]:
from sklearn.cross_validation import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(X, y)

4、使用贝叶斯分类器进行训练

  • 重要的参数alpha用于设置平滑系数
In [21]:
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha =1).fit(xtrain, ytrain)

5、观察分类效果

In [22]:
training_accuracy = clf.score(xtrain, ytrain)
test_accuracy = clf.score(xtest, ytest)
print "训练集准确率:  {:.2f}".format(training_accuracy)
print "检验集准确率:  {:.2f}".format(test_accuracy)  
训练集准确率:  0.98
检验集准确率:  0.97

6、使用CV选择最优参数,参数为0.2

In [23]:
from sklearn import svm, grid_search
nb = MultinomialNB()
parameters = {'alpha':np.linspace(0,10,101)}
clf = grid_search.GridSearchCV(nb, parameters)
clf.fit(X, y)
Out[23]:
GridSearchCV(cv=None,
       estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
       fit_params={}, iid=True, loss_func=None, n_jobs=1,
       param_grid={'alpha': array([  0. ,   0.1, ...,   9.9,  10. ])},
       pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring=None,
       verbose=0)
In [100]:
print "最佳参数:  {:.3f}".format(clf.best_params_['alpha'] )
print "最佳准确率:  {:.3f}".format(clf.best_score_)  
最佳参数:  0.200
最佳准确率:  0.984

In [62]:
accuracy = [t[1] for t in clf.grid_scores_]
para = [t[0]['alpha'] for t in clf.grid_scores_]
In [94]:
import matplotlib.pylab as plt
accuracy = [t[1] for t in clf.grid_scores_]
para = [t[0]['alpha'] for t in clf.grid_scores_]
plt.plot(para,accuracy,lw=3)
Out[94]:
[]

星期日, 一月 19, 2014

一份数据挖掘小书评

书看得多了,渐渐有了品味,所以看那些英文版的时候也不再有很膜拜的感觉。不过再差的书,总会有些许长处或教训,值得借鉴。下面列出一些在数据挖掘实现方面的书,主要是基于R和python的。


  • Data mining with R Learning with Case studies: 我的启蒙书,很好的案例教学,这种书应该出更多些。
  • Data Mining Applications with R: 风格类似上面,多人合作的案例讲解,非常不错,就是每个例子略为简短了一点。
  • Machine Learning for Hackers: 也是以案例为主,但是内容质量不能保持在同一水准上,代码讲的比较细。
  • An Introduction to Statistical Learning: 比较系统的讲解了统计学习的内容,以及相应的R包函数,优点在于有习题。
  • Machine Learning with R: 同样是系统的列出各机器学习算法对应的R包函数,直观理解很好,而且讲了一些caret包的使用。比较新的书。
  • Applied predictive modeling: 对预测算法讲的最细,涉及R包最多,由于作者是caret的开发者,所以要学习caret则必看此书。
  • Big Data Analytics with R and Hadoop: 刚出的大数据挖掘书籍,讲解了如何用RHadoop来整合R和hadoop,什么时候会有R和spark的书出来啊。

  • programming_collective_intelligence: 有些年头的书了,但确实是经典,原理讲的简洁,就讲python代码实现,喜欢这种风格。
  • Machine Learning in Action: 和上面风格类似,不过实现是主要基于python的numpy库,这样代码量要精简很多,也很好。
  • Python for data analysis: 主要讲pandas库,精彩例子不多,可以直接去看帮助文档。
  • Learning scikit-learn Machine Learning: 主要以scikit-learn扩展库为工具做机器学习,比较简单,可以直接去看帮助文档。
  • Building Machine Learning Systems with Python: 和上面那本类似,讲函数功能为主,原理直觉没涉及到。

星期五, 三月 08, 2013

数据挖掘的三行俳句


最近才看到Tom Khabaza写的一篇很有份量的文章,阐述了数据挖掘的九大法则,在最后他以俳句方式进行了总结,可谓是字字珠玑。原文很长,只将俳句和各法则的纲要翻译放在这里。

First the business goal // Is all in data mining // This defines the field
Second is knowledge // Of business at every stage // This is the centre
Third prepare data // The form permits the question // Shape the problem space
Fourth is no free lunch / /By searching find the model // And the goal may change
Fifth is Watkins law / /There will always be patterns // Traces in data
Sixth is perception // Data mining amplifies // Thus we find insight
Seventh prediction // Generalised from data // New facts locally
Eighth is the value // All value comes from business // Not technical things
Ninth and last is change // No pattern lasts forever // We do not stand still
Miners know this truth / /How can business be better? / /If we see what is
Can the process change? // Technology can change it / /None has done so yet

1、商业目标是数据挖掘的起点
2、业务知识贯穿着数据挖掘的每个阶段
3、数据挖掘中的大部分工作是数据准备
4、对于给定的问题,只有不断尝试才能得到适合的模型
5、模式总会存在
6、数据挖掘能增强对业务的理解
7、通过归纳,预测模型增加了信息量
8、数据挖掘的价值并不取决于模型的准确或稳定
9、所有的模式都会改变

星期五, 一月 04, 2013

浅谈ROC曲线

机器学习中很常见的一个大类就是二元分类器。很多二元分类器会产生一个概率预测值,而非仅仅是0-1预测值。我们可以使用某个临界点(例如0.5),以划分哪些预测为1,哪些预测为0。得到二元预测值后,可以构建一个混淆矩阵来评价二元分类器的预测效果。所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetive。同时可以相应算出TPR(真正率或称为灵敏度)和TNR(真负率或称为特异度)。我们主观上希望这两个指标越大越好,但可惜二者是一个此消彼涨的关系。除了分类器的训练参数,临界点的选择,也会大大的影响TPR和TNR。有时可以根据具体问题和需要,来选择具体的临界点。


星期三, 十一月 28, 2012

决策树之三国争霸


决策树是一种简洁实用的数据挖掘方法。在R中通常可以用rpart包和party包来实现两种算法的决策树。最近著名的C4.5决策树算法的升级版本C5.0已经可以在官网下载到。对于这三种决策树算法,本文来做一个预测效果的简单对比。

对比用的数据集是C50包中自带的churn数据,它是用来预测顾客流失的数据集,其中样本量为3333个,变量数为20个。为不平衡数据,没有缺失值存在。对比基本步骤是用10重交叉检验,将数据随机分为10份,用9份训练决策树,用1份来检验结果。循环后求出10个预测准确度的均值。然后在外面再套一个100次大循环,产生三个决策树算法各100个准确率。最后绘制为提琴图,从图中可以观察到C5.0的表现最好,而party次之,rpart的效果最差。在本例实验中最大的差距虽然不过0.02,但如果放在kaggle的数据挖掘比赛中,就相当于是一百位名次的差距了。

星期五, 七月 20, 2012

用gbm包实现随机梯度提升算法


中国有句老话:三个臭皮匠,顶个诸葛亮。这个说法至少在变形金刚中得到了体现,没有组合之前的大力神只是五个可以被柱子哥随手秒掉工地苦力。但组合之后却是威力大增。在机器学习领域也是如此,一堆能力一般的“弱学习器”也能组合成一个“强学习器”。前篇文章提到的随机森林就是一种组合学习的方法,本文要说的是另一类组合金刚:提升方法(Boosting)。提升方法是一大类集成分类学习的统称。它用不同的权重将基学习器进行线性组合,使表现优秀的学习器得到重用。在R语言中gbm包就是用来实现一般提升方法的扩展包。根据基学习器、损失函数和优化方法的不同,提升方法也有各种不同的形式。

自适应提升方法AdaBoost
它是一种传统而重要的Boost算法,在学习时为每一个样本赋上一个权重,初始时各样本权重一样。在每一步训练后,增加错误学习样本的权重,这使得某些样本的重要性凸显出来,在进行了N次迭代后,将会得到N个简单的学习器。最后将它们组合起来得到一个最终的模型。

梯度提升方法Gradient Boosting
梯度提升算法初看起来不是很好理解,但我们和线性回归加以类比就容易了。回忆一下线性回归是希望找到一组参数使得残差最小化。如果只用一次项来解释二次曲线一定会有大量残差留下来,此时就可以用二次项来继续解释残差,所以可在模型中加入这个二次项。

同样的,梯度提升是先根据初始模型计算伪残差,之后建立一个基学习器来解释伪残差,该基学习器是在梯度方向上减少残差。再将基学习器乘上权重系数(学习速率)和原来的模型进行线性组合形成新的模型。这样反复迭代就可以找到一个使损失函数的期望达到最小的模型。在训练基学习器时可以使用再抽样方法,此时就称之为随机梯度提升算法stochastic gradient boosting


星期日, 七月 15, 2012

随机森林及其副产品


随机森林(Random Forest)方法是Leo Breiman于2001年提出的一种集成学习(Ensemble Learning)方法,它是传统决策树方法的扩展,将多个决策树进行组合,来提高预测精度。随机森林利用分类回归树(CART)作为其基本组成单元,也可称之为基学习器或是子模型。CART在之前的文章中我们已经介绍过,就不再详细说明了。而集成学习的思路是试图通过连续调用单个学习算法,获得不同的学习器,然后根据规则组合这些学习器来解决同一个问题,可以显著的提高学习系统的泛化能力。组合多个学习器主要采用加权平均或投票的方法。常见的集成学习算法还包括了装袋算法(Bagging)和提升算法(Boosting)。

1. 随机森林计算步骤

  • 从原始训练样本中随机有放回抽出N个样本;
  • 从解释变量中随机抽出M个变量;
  • 依据上述得到的子集实施CART方法(无需剪枝),从而形成一个单独的决策树;
  • 重复上面步骤X次,就构建了有X棵树的随机森林模型。
  • 在对新数据进行预测分类时,由X棵树分别预测,以投票方式综合最终结果。

星期五, 七月 06, 2012

谈一谈支持向量机分类器


支持向量机(Support Vector Machine)名字听起来很炫,功能也很炫,但公式理解起来常有眩晕感。所以本文尝试不用一个公式来说明SVM的原理,以保证不吓跑一个读者。理解SVM有四个关键名词:分离超平面、最大边缘超平面、软边缘、核函数

  • 分离超平面separating hyperplane:处理分类问题的时候需要一个决策边界,好象楚河汉界一样,在界这边我们判别A,在界那边我们判别B。这种决策边界将两类事物相分离,而线性的决策边界就是分离超平面。
  • 最大边缘超平面(Maximal Margin Hyperplane):分离超平面可以有很多个,怎么找最好的那个呢,SVM的作法是找一个“最中间”的。换句话说,就是这个平面要尽量和两边保持距离,以留足余量,减小泛化误差,保证稳健性。或者用中国人的话讲叫做“执中”。以江河为国界的时候,就是以航道中心线为界,这个就是最大边缘超平面的体现。在数学上找到这个最大边缘超平面的方法是一个二次规划问题。
  • 软边缘(Soft Margin):但世界上没这么美的事,很多情况下都是“你中有我,我中有你”的混杂状态。不大可能用一个平面完美的分离两个类别。在线性不可分情况下就要考虑软边缘了。软边缘可以破例允许个别样本跑到其它类别的地盘上去。但要使用参数来权衡两端,一个是要保持最大边缘的分离,另一个要使这种破例不能太离谱。这种参数就是对错误分类的惩罚程度C。
  • 核函数(Kernel Function),为了解决完美分离的问题,SVM还提出一种思路,就是将原始数据映射到高维空间中去,直觉上可以感觉高维空间中的数据变的稀疏,有利于“分清敌我”。那么映射的方法就是使用“核函数”。如果这种“核技术”选择得当,高维空间中的数据就变得容易线性分离了。而且可以证明,总是存在一种核函数能将数据集映射成可分离的高维数据。看到这里各位不要过于兴奋,映射到高维空间中并非是有百利而无一害的。维数过高的害处就是会出现过度拟合。
所以选择合适的核函数以及软边缘参数C就是训练SVM的重要因素。一般来讲,核函数越复杂,模型越偏向于拟合过度。在参数C方面,它可以看作是LASSO算法中的lambda的倒数,C越大模型越偏向于拟合过度,反之则拟合不足。实际问题中怎么选呢?用人类最古老的办法,试错。


星期二, 七月 03, 2012

朴素贝叶斯分类与贝叶斯网络


朴素贝叶斯分类(Naive Bayes Classifier)是一种简单而容易理解的分类方法,看起来很Naive,但用起来却很有效。其原理就是贝叶斯定理,从数据中得到新的信息,然后对先验概率进行更新,从而得到后验概率。好比说我们判断一个人的品质好坏,对于陌生人我们对他的判断是五五开,如果说他做了一件好事,那么这个新的信息使我们判断他是好人的概率增加了。朴素贝叶斯分类的优势在于不怕噪声和无关变量,其Naive之处在于它假设各特征属性是无关的。而贝叶斯网络(Bayesian Network)则放宽了变量无关的假设,将贝叶斯原理和图论相结合,建立起一种基于概率推理的数学模型,对于解决复杂的不确定性和关联性问题有很强的优势。下面我们用mlbench包中的一个数据集来看看如何用这两种方法进行学习训练。

PimaIndiansDiabetes2是美国一个疾病研究机构所拥有的一个数据集,其中包括了9个变量,共有768个样本。响应变量即是对糖尿病的判断,它是一个二元变量。其它各解释变量是个体的若干特征,如年龄和其它医学指标,均为数值变量。其中有一些缺失值的存在,虽然朴素贝叶斯分类对于缺失值并不敏感,我们还是先将其进行插补,再进行建模以观察准确率。R语言中的e1071包中就有可以实施朴素贝叶斯分类的函数,但在本例我们使用klaR包中的NaiveBayes函数,因为该函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度函数。为了避免过度拟合,在训练时还要将数据分割进行多重检验,所以我们还使用了caret包的一些函数进行配合。

# 加载扩展包和数据
library(caret)
data(PimaIndiansDiabetes2,package='mlbench')
# 对缺失值使用装袋方法进行插补
preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute")
data <- predict(preproc,PimaIndiansDiabetes2[-9])
data$Class <- PimaIndiansDiabetes2[,9]
# 使用朴素贝叶斯建模,这里使用了三次10折交叉检验得到30个结果
fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 3,returnResamp = "all")
model1 <- train(Class~., data=data,method='nb',trControl = fitControl,tuneGrid = data.frame(.fL=1,.usekernel=F))
# 观察30次检验结果,发现准确率在0.75左右
resampleHist(model1)
# 返回训练数据的混淆矩阵
pre <- predict(model1)
confusionMatrix(pre,data$Class)

星期四, 六月 14, 2012

成为优秀的数据挖掘者所需要的七条建议



这七条建议是数据挖掘领域的资深专家Dean Abbott在一个访谈中提到的部分内容,原文可以参见这里

1、在数据挖掘项目中最为重要的是清晰的定义问题。将商业目标与合适的数据分析技术相匹配并不是一件容易的事情。所以项目首要任务就是明确问题和目标变量。

2、不去试图代替业务专家。业务专家拥有专门业务领域的知识,他可以帮助你理解数据的意义。数据挖掘者本身并不能给出商业方案。其作用在于将数据信息处理成有意义的结构,然后使业务专家做出更好的商业决策。

3、单独一个模型无法把握全局。每个模型都会提供一个不同的视角,所以我们需要将多个学习器加以组合,使我们对数据的把握更为全面。

4、决策树是一种贪婪算法。决策树模型的结果可能会欺骗你,因为分枝一旦确定就不能再回头修改。而随机森林是决策树的组合算法,从而弥补了这种贪婪的特性。

5、归纳有时候对数据是不公平的。计算平均数等统计量有时候是有用的,但也会有欺骗性,所以将数据可视化永远是必要的步骤。

6、没有什么能击败时间。管理人士需要提供数据分析师充足的时间资源。时间可以发酵灵感,有时候在不经意间,你能构想出解决问题的处理方法。

7、何时停手并没有一定之规。一般来讲,如果建立的模型表现一致,就可以说已经从数据中获得了足够的东西。有时候你还得考虑项目所剩的时间和其它资源,以决定何时终止挖掘。毕竟数据挖掘的边际报酬是递减的,你需要考虑到进一步实施挖掘工作的回报问题。

星期二, 五月 15, 2012

分享几本数据挖掘书籍


The Elements of Statistical Learning: Data Mining, Inference, and Prediction
广受推崇的统计学习书籍,重视理论基础,图文并茂,各种算法讲解清晰。但没有涉及实务中的问题,如特征选择。


星期日, 五月 06, 2012

为KNN分类器增加Cross-Validation功能


有这么一句很有趣的话,如果一个东西走路象鸭子、叫起来象鸭子、吃起来也象鸭子,那它就是一只鸭子。这是一种很符合我们直觉的思维方式:将未知的对象和已知的东西相比较,如果各个属性相近,我们就把它们归为一个类别。这就是KNN分类器的思想。

KNN即是kth Nearest Neighbor。如果我们已经拥有一些已知类别的数据,要对一些未知类别的数据进行分类。基本思路就是将数据看作是在多元空间中的点,先计算未知点和周围k个已知点之间的距离。然后根据周围k个已知点的类别进行投票来决定未知点的类别。例如设k为3,对某个未知点找出其周围最近的三个已知点,如果这三个点有两个属于A类,一个属于B类,那么根据多数原则,将未知点的类别预测为A类。

KNN算法的优势在于算法简单,稳健性强,可以构成非线性的判别边界,模型参数简单,只有距离测度和k参数。其弱点在于计算量较大,对异常点较为敏感,对不平衡数据也很敏感。R语言中class包的knn函数可以实行基本的KNN算法。

星期日, 二月 12, 2012

数据挖掘中的九种错误


1 只关注训练数据
训练样本之外的数据才是真正重要的。安德森医疗中心的研究人员在十年前使用神经网络来检测癌症。相对于训练样本,他们的检验样本表现不佳,但还算不错的。但他们认为应该加大神经网络的训练时间,结果检验样本的表现比以前更为糟糕。这就是一个很典型的过度拟合的案例。避免过度拟合的重要手段是保留数据。一些有用的方法包括:自举法(bootstrap)、多重交叉检验(cross-validation)、刀切法(jackknife)、留一法(leave-one-out)。

2 只依赖一种技术
有句老话说:如果你手里只有一把锤子,那么看任何东西都象是一个钉子。在不同的问题背景下,模型的效果是不同的,你必须有一整套工具才能从中选择一种最优的。对同一个问题,至少你得比较新旧两种方法的优劣。相对于专业知识和数据的优良性,单一的建模技术不一定能解决很大问题。John Elder等人在1997年用五种算法对六类数据集进行了比较研究,结果发现没有一种算法能够通吃所有的数据。所以说,一把钥匙开一把锁。

星期三, 一月 11, 2012

Twitter文本挖掘初步

Twitter已经成为社交媒体领域重要的信息来源,也是数据挖掘和可视化的重点研究对象。据说华尔街的多家对冲基金公司已经在利用twitter数据挖掘来衡量人们的情绪,从而预测资本市场的运动方向。可见在未来数年,对twitter信息的挖掘必将成为一个热点。

在R语言中提取twitter信息的扩展包是twitterR,它可以提取公共信息流,也可以针对某个用户提取其信息流,或者是以某个标签搜索推文。下面我们以“wukan”(乌坎)为关键词搜索推文标签,观察推友的发推数量。

首先载入软件包,以#wukan为关键词提取1000条推文,然后将其转化为数据框格式。df数据中存储的中文推文内容在R中似乎无法正常浏览,不过推文的用户名仍然是英文的可加以利用。

星期二, 一月 10, 2012

数据挖掘项目失败的原因

商业智能(BI)领域内,预测分析和数据挖掘(PADM)一直缓慢而稳步的成长。机器学习(Machine Learning)技术是支持PADM的重要驱动力量。在过去二十年间出现的桌面计算能力和软件自动化水平,使得PADM在各大中型企业的商业智能运用中起到了重要的作用。虽然存在阻力影响着PADM的广泛运用,但PADM的势头将继续增长。这是因为大多数组织正在稳步进行商业智能的开发,这包括了从数据采集,存储,结构,探索,可视化等方面。

为什么大多数PADM项目会失败
在商业世界中,更为看重的是对业务的提升而非精妙的技术。可惜的是,大部分的专业人士把重点放在构建精确模型的技术上。这样构建出来的模型没有回答正确的商业问题。建模结果无法得到很好的解释,也无法适用于运营环境。这样的结果不能合理的实现,也不能被高层所理解和赞赏。这也难怪,有相当数量的项目没有完成,也就无法得到正的投资回报率。

星期三, 一月 04, 2012

Moneyball与体育数据挖掘

培根曾说,知识就是力量。如果以Billy Beane的角度来看,他也许会说,数据就是金钱。

一、背景
Moneyball》是Michael Lewis在2003年出版的一本书,讲述奥克兰运动家棒球队总经理比利·比恩(Billy Beane)利用体育数据挖掘来组织球队获得胜利的故事。由此书改编的影片在2011年上映,其中billy是由著名影星Brad Pitt出演。这本书颠覆了美国传统的体育管理思路,Billy Beane的经营哲学是用极少的资金经营这家俱乐部,他打破常规方法,使用历史数据和数据挖掘方法来构建评价模型,低价购入了那些被低估的球员。使得球队有能力与大名鼎鼎的纽约扬基队竞争市场。

星期日, 十一月 13, 2011

数据挖掘之你问我答(5/5)

注:本文是由Tim Graettinger的文章编译而来
问题五:最新的算法一定能得到更好的结果吗?

并非如此。

在读研究生的时候,我学到了各种预测建模的算法,并将大部分进行了编程实践。毕业后我去了一家专注于神经网络的软件公司,我想这是最厉害的建模技术了!

工作期间我咨询了许多使用我们公司软件进行应用的客户。在通常情况下,客户的内部员工已经开发过相关的应用,其建模技术并不比神经网络更为复杂。而我发现,相对之前的模型,神经网络技术顶多只能提供微弱的改进。

星期五, 十一月 11, 2011

数据挖掘之你问我答(4/5)

注:本文是由Tim Graettinger的文章编译而来
问题四:我的模型在训练数据上表现很好,为什么在新数据上表现很糟?

你遇到的就是被称为“过度拟合”(over-fit)的典型症状。通常是在为稀有事件建模时较为容易产生这种问题,例如发动机故障预测。

当某种输出结果非常罕见(如百分之一或千分之一)时,就会倾向于建立很复杂的模型。复杂的模型会有很多参数,用来预测或者说“适应”训练数据。问题是,该模型包含了训练数据所独有的特征,但在其它地方并不一定适用。这就像为你自己量身定制的衣服只适合于你自己,但并不适合其他人。在建模的世界里出现过度拟合是糟糕的。我们要构建的是稳健的、能概括新数据的模型。

你能做些什么呢?

星期四, 十一月 10, 2011

数据挖掘之你问我答(3/5)

注:本文是由Tim Graettinger的文章编译而来
问题三:进行数据挖掘需要多少数据?

这是迄今为止关于数据挖掘最常见的问题,这个问题得到如此多的关注是有其原因的。当你第一次进行数据挖掘,几乎会下意识的提出这个问题。你想知道,从数据挖掘的角度来讲手里的数据是否足够。尽管问题很简单,但在没有更深理解问题的前提下回答它却是不明智的。在这里我只能提供一些原则性的指导意见,然后你可就此来做为进一步工作的起点。我甚至会提供一个经验法则来帮助你估计所需要的数据。

第一个原则是基于关系的复杂度。你想构建的关系越复杂,你就需要越多的数据来准确的构建它。但是,你可能会说,“我不知道关系有多复杂啊”。从现实角度来看,关系的复杂度可以从影响关系的因子来加以判断。比方说,要预测天气。那么想想可能的影响因素会有哪些,例如风力、风向、温度、湿度、云层等等。你需要对可能的影响因素有大体的估计。