在没有 Analysis Services 的情况下使用 SQL Server 2005 进行数据挖掘
一个 C# 实现的 CHAID 算法,类似于 Cognos 的场景。
引言
很久以前,我使用过一个名为 Scenario 的 Cognos 数据挖掘产品。我非常喜欢它,以至于我决定编写自己的 CHAID 算法实现(见下面的背景介绍)。那时,我用 Borland C++ Builder v. 4 编写(参见上面的 BCB 源代码下载),并针对 Scenario 进行了测试。在获得了我想要的结果(相同的结果)后,我失去了进一步的兴趣,并将我的代码冷藏起来……
将近十年后,我再次面临数据挖掘任务。与此同时,世界发生了很大变化。旧的 Cognos Scenario 似乎已经被遗忘(而且我无法再访问它),数据库也发生了演变。在工作中,我们有一个适合数据挖掘的 SQL Server 2005 数据库,而 CHAID 看起来是一个很好的方法候选。当然,我记得我的代码,并寻找一种尽可能重用的方法。我无法直接使用它,因为数据库平台发生了变化;我的 Borland Database Engine 许可证不包含任何对 MS SQL Server 的支持。我曾短暂考虑过尝试用第三方组件来弥合差距,但我在网上找不到免费的组件。然后,我发现了 Microsoft Chart Controls for .NET Framework 3.5,并决定用 C# 重新编写我的应用程序。我必须承认,我同时受到了 CodeProject 上的文章“使用 SQL Server 2005 进行数据挖掘”的启发。同样,我将这篇文章列为中级,因为我自己不是专业的程序员。困难的部分可能在于理解 CHAID 算法和统计背景、Bonferonni 调整等等。
背景
CHAID 代表卡方自动交互检测。我的实现基于 G. V. Kass 的一篇较早的文章(《探索性技术,用于研究大量分类数据》,Applied Statistics 29, No. 2, 1980, pp. 119-127)。Cognos 的文档公开不可用,但参考它也将是一个主要的优势。(我想我曾经可以访问一篇题为“Scenario 的工作原理”之类的文档。)
使用代码
该代码可用于分析所有预测变量都是“自由”的(非单调)的分类数据。因变量和预测变量都应在数据库中表示为字符串。我仅针对名为 *Records* 的单个 MSSQL 表测试了我的应用程序,但我认为也可以使用数据库视图。为了快速入门,我建议按如下方式设置 *Records* 表
USE [DatabaseName]
GO
/****** Object: Table [dbo].[Records] Script Date: 12/31/2008 22:27:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Records](
[ID] [int] NOT NULL,
[FlavorPreference] [nvarchar](255) NULL,
[FreeGoProductSelected] [nvarchar](255) NULL,
[WrappingColorPreference] [nvarchar](255) NULL,
[PricePoint] [nvarchar](255) NULL,
[WouldBuy] [nvarchar](255) NULL,
[SurveyLocation] [nvarchar](255) NULL,
[Age] [nvarchar](255) NULL,
[FlavorCode] [nvarchar](255) NULL,
[Gender] [nvarchar](255) NULL,
[WebAccess] [nvarchar](255) NULL,
[LikesCamping] [nvarchar](255) NULL,
[GoKnowledge] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
) ON [PRIMARY]
我没有在下载中包含任何数据,但我相信您可以将自己的测试数据填入表中。请不要忘记编辑 *app.config* 文件。
我不认为有人会真正想使用原始的 C++ 实现;它仅用于参考。请注意,没有可用的配置,例如,表名和列名是硬编码的。
如果您成功构建了 C# 应用程序并填充了您的 MSSQL 数据库,您应该可以看到类似这样的内容,顶部有相应的 BCB 截图。
关注点
如果将 C# 代码 (MSSQL) 与原始 C++ 版本 (BDE, MS Access 97) 进行比较,您会注意到新的 SQL SELECT
语句(在幕后自动生成)包括 "order by
" 子句以及 "group by
" 子句。对我来说,发现在 SQL Server 的情况下必须同时指定这两个子句,这让我感到非常惊讶。另一个经验教训是数据库连接字符串中 MultipleActiveResultSets=True
规范的重要性,请参见 *app.config*。
历史
- 2008年12月31日 - 初次发布。