65.9K
CodeProject 正在变化。 阅读更多。
Home

在没有 Analysis Services 的情况下使用 SQL Server 2005 进行数据挖掘

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (4投票s)

2008年12月31日

公共领域

3分钟阅读

viewsIcon

40413

downloadIcon

1683

一个 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日 - 初次发布。
© . All rights reserved.