18、机器学习深度探索与企业数据科学实践

机器学习深度探索与企业数据科学实践

1. 机器学习算法与模型评估

在机器学习领域,模型评估是至关重要的环节。以支持向量机(SVM)对糖尿病数据的分类为例,通过混淆矩阵可以直观地了解模型的性能。以下是一个混淆矩阵的示例:

Confusion Matrix and Statistics
          Reference
Prediction neg pos
neg  93  26
pos  7  27
Accuracy : 0.7843
                 95% CI : (0.7106, 0.8466)
    No Information Rate : 0.6536
    P-Value [Acc> NIR] : 0.0003018
Kappa : 0.4799
Mcnemar's Test P-Value : 0.0017280
Sensitivity : 0.9300
Specificity : 0.5094
PosPredValue : 0.7815
NegPredValue : 0.7941
Prevalence : 0.6536
         Detection Rate : 0.6078
   Detection Prevalence : 0.7778
      Balanced Accuracy : 0.7197
       'Positive' Class : neg

从这个混淆矩阵中,我们可以获取多个重要的评估指标:
- 准确率(Accuracy) :模型正确预测的比例,这里为 0.7843。
- 敏感度(Sensitivity) :实际为正例时模型预测为正例的比例,这里是 0.9300。
- 特异度(Specificity) :实际为负例时模型预测为负例的比例,为 0.5094。

这些指标综合起来可以帮助我们全面评估模型的性能。

2. K-Means 机器学习技术

K-Means 是一种流行的无监督机器学习技术,用于创建聚类并对数据进行分类。下面通过一个大学课程选课的例子来直观理解。

假设一所大学开设了美国历史和亚洲历史两门新课程,学校保持 15:1 的师生比例。学校进行了一项调查,每个学生对这两门课程的学习偏好给出 1 - 10 分的数值评分。我们可以使用 R 语言中的内置 K-Means 算法创建 2 个聚类,通过每个聚类中的点数来估计可能报名每门课程的学生数量。以下是实现代码:

library(data.table)
library(ggplot2)
library()
historyData <- fread("~/Desktop/history.csv")
ggplot(historyData, aes(american_history, asian_history)) + geom_point() + geom_jitter()
historyCluster <- kmeans(historyData, 2) # Create 2 clusters
historyData[, cluster := as.factor(historyCluster$cluster)]
ggplot(historyData, aes(american_history, asian_history, color = cluster)) + geom_point() + geom_jitter()

K-Means 算法的标准实现是 Lloyd’s 算法,其步骤如下:
1. 从数据集中随机选择 k 个点作为 k 个聚类的中心点(初始质心)。
2. 计算每个其他点到这 k 个中心点的距离,并将该点分配到距离最近的聚类中。
3. 重新计算每个聚类的中心,即该聚类中所有点的均值。
4. 重复步骤 2 和 3,直到没有新的数据被重新分配。

在聚类过程中,有多种距离和相似度度量方法,如欧几里得距离、余弦相似度、汉明距离和马氏距离等。确定最优聚类数通常是一个挑战,常用的方法是肘部法。肘部法通过绘制簇内平方和(WSS)与聚类数的关系图来确定最优聚类数。当增加聚类数不再显著降低 WSS 时,对应的聚类数即为最优。例如,在一个示例图中,从 1 到 2 个聚类时 WSS 显著下降,到第 4 或 5 个聚类后,增加聚类数对 WSS 的改善不明显,因此可以判断理想的聚类数在 3 - 5 之间。

3. 神经网络相关算法

神经网络相关算法已经存在了数十年。1943 年,Warren McCulloch 和 Walter Pitts 在《数学物理学报》上描述了第一个计算模型。神经网络本质上是人类神经系统中神经元之间数据交换现象的表示。一个人工神经网络主要由输入层、隐藏层、输出层以及节点和权重组成。

每个节点根据前一层的输入,通过激活函数产生输出。常见的激活函数包括二进制阶跃函数(输出 0 或 1)、双曲正切函数(输出在 -1 到 +1 之间)和 Sigmoid 函数等。输出可以用公式 ( f = f(\sum_{i=1}^{n} w_i x_i + b) ) 表示,其中 ( f ) 是激活函数,( w_i ) 是权重,( x_i ) 是输入,( b ) 是偏置项,偏置项独立于权重和输入值,可用于调整输出以提高模型性能。

近年来,具有多个隐藏层的神经网络,即深度神经网络或深度学习,变得非常流行。在 R 语言中,nnet 包提供了一个易于使用的神经网络接口。以下是使用 nnet 包对 PimaIndiansDiabetes 数据集进行分类的示例代码:

library(mlbench)
library(caret)
set.seed(123)
data("PimaIndiansDiabetes")
diab <- PimaIndiansDiabetes
train_ind <- createDataPartition(diab$diabetes, p = 0.8, list = FALSE, times = 1)
training_diab <- diab[train_ind, ]
test_diab <- diab[-train_ind, ]
nnet_grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(3, 5, 7))
nnet_model <- train(diabetes ~ ., data = training_diab, method = "nnet", metric = "Accuracy", maxit = 500, tuneGrid = nnet_grid)
# Generating predictions using the neural network model
nnet_predicted <- predict(nnet_model, test_diab)
> plot (nnet_model)
# Confusion Matrix for the Neural Network model
confusionMatrix(nnet_predicted, test_diab$diabetes)

运行上述代码后,同样可以得到一个混淆矩阵来评估神经网络模型的性能:

Confusion Matrix and Statistics
          Reference
Prediction neg pos
neg  86  22
pos  14  31
Accuracy : 0.7647
                 95% CI : (0.6894, 0.8294)
    No Information Rate : 0.6536
    P-Value [Acc> NIR] : 0.001988
Kappa : 0.4613
Mcnemar's Test P-Value : 0.243345
Sensitivity : 0.8600
Specificity : 0.5849
PosPredValue : 0.7963
NegPredValue : 0.6889
Prevalence : 0.6536
         Detection Rate : 0.5621
   Detection Prevalence : 0.7059
      Balanced Accuracy : 0.7225
       'Positive' Class : neg
4. 关联规则挖掘教程 - 使用 CMS 数据

本教程将实现一个接口,用于访问使用 R 语言中的 Apriori 包创建的规则。我们将从 CMS OpenPayments 网站下载数据,该网站提供了公司向医生和医院支付款项的数据。

4.1 下载数据

数据可以通过 Unix 终端(在虚拟机中)或直接从浏览器访问网站下载。

在虚拟机的终端窗口中运行以下命令:

time wget -O cms2016_2.csv 'https://openpaymentsdata.cms.gov/resource/vq63-hu5i.csv?$query=select Physician_First_Name as firstName,Physician_Last_Name as lastName,Recipient_City as city,Recipient_State as state,Submitting_Applicable_Manufacturer_or_Applicable_GPO_Name as company,Total_Amount_of_Payment_USDollars as payment,Nature_of_Payment_or_Transfer_of_Value as paymentNature,Product_Category_or_Therapeutic_Area_1 as category,Name_of_Drug_or_Biological_or_Device_or_Medical_Supply_1 as product where covered_recipient_type like "Covered Recipient Physician" and Recipient_State like "NY" limit 1200000'

或者在浏览器中输入以下 URL 并回车:

https://openpaymentsdata.cms.gov/resource/vq63-hu5i.csv?$query=select Physician_First_Name as firstName,Physician_Last_Name as lastName,Recipient_City as city,Recipient_State as state,Submitting_Applicable_Manufacturer_or_Applicable_GPO_Name as company,Total_Amount_of_Payment_USDollars as payment,Nature_of_Payment_or_Transfer_of_Value as paymentNature,Product_Category_or_Therapeutic_Area_1 as category,Name_of_Drug_or_Biological_or_Device_or_Medical_Supply_1 as product where covered_recipient_type like "Covered Recipient Physician" and Recipient_State like "NY"
4.2 编写 Apriori 的 R 代码

我们将使用 R/RStudio 中的 arules 包来运行 Apriori 算法以找到关联规则。以下是具体代码:

library(data.table)
library(arules)
cms <- fread("~/cms2016_2.csv") # CHANGE THIS TO YOUR LOCATION OF THE DATA
cols <- c("category", "city", "company", "firstName", "lastName", "paymentNature", "product")
cms[ , (cols) := lapply(.SD, toupper), .SDcols = cols]
cms[, payment := as.numeric(payment)]
quantile_values <- quantile(cms$payment, seq(0, 1, .25))
interval_values <- findInterval(cms$payment, quantile_values, rightmost.closed = TRUE)
cms[, quantileVal := factor(interval_values, labels = c("0 - 25", "25 - 50", "50 - 75", "75 - 100"))]
rules_cols <- c("category", "city", "company", "paymentNature", "product", "quantileVal")
cms[ , (rules_cols) := lapply(.SD, factor), .SDcols = rules_cols]
cms_factor <- cms[, .(category, city, company, paymentNature, product, quantileVal)]
rhsVal <- paste0("quantileVal", "=", c("0 - 25", "25 - 50", "50 - 75", "75 - 100"))
cms_rules <- apriori(cms_factor, parameter = list(supp = 0.001, conf = 0.25, target = "rules", minlen = 3))
cms_rules_dt <- data.table(as(cms_rules, "data.frame"))
cms_rules_dt[, c("LHS", "RHS") := tstrsplit(rules, "=>", fixed = TRUE)]
num_cols <- c("support", "confidence", "lift")
cms_rules_dt[ , (num_cols) := lapply(.SD, function(x) {round(x, 2)}), .SDcols = num_cols]
saveRDS(cms_rules_dt, "cms_rules_dt.rds")
saveRDS(cms_factor, "cms_factor_dt.rds")
4.3 Shiny(R 代码)

在 RStudio 中创建一个新的 Shiny Web 应用,在 app.R 中输入以下代码:

# Packt: Big Data Analytics
# Chapter 8 Tutorial
library(shiny)
library(shinydashboard)
library(data.table)
library(DT)
library(shinyjs)
cms_factor_dt <- readRDS("~/r/rulespackt/cms_factor_dt.rds")
cms_rules_dt <- readRDS("~/r/rulespackt/cms_rules_dt.rds")
# Define UI for application that draws a histogram
ui <- dashboardPage (skin = "green",
                     dashboardHeader(title = "Apriori Algorithm"),
                     dashboardSidebar(
                       useShinyjs(),
                       sidebarMenu(
                         uiOutput("company"),
                         uiOutput("searchlhs"),
                         uiOutput("searchrhs"),
                         uiOutput("support2"),
                         uiOutput("confidence"),
                         uiOutput("lift"),
                         downloadButton('downloadMatchingRules', "Download Rules")
                       )
                     ),
                     dashboardBody(
                       tags$head(
                         tags$link(rel = "stylesheet", type = "text/css", href = "packt2.css"),
                         tags$link(rel = "stylesheet", type = "text/css", href = "//fonts.googleapis.com/css?family=Fanwood+Text"),
                         tags$link(rel = "stylesheet", type = "text/css", href = "//fonts.googleapis.com/css?family=Varela"),
                         tags$link(rel = "stylesheet", type = "text/css", href = "fonts.css"),
                         tags$style(type = "text/css", "select { max - width: 200px; }"),
                         tags$style(type = "text/css", "textarea { max - width: 185px; }"),
                         tags$style(type = "text/css", ".jslider { max - width: 200px; }"),
                         tags$style(type = 'text/css', ".well { max - width: 250px; padding: 10px; font - size: 8px}"),
                         tags$style(type = 'text/css', ".span4 { max - width: 250px; }")
                       ),
                       fluidRow(
                         dataTableOutput("result")
                       )
                     ),
                     title = "Aprior Algorithm"
)
# Define server logic required to draw a histogram
server <- function(input, output, session) {
  PLACEHOLDERLIST2 <- list(
    placeholder = 'Select All',
    onInitialize = I('function() { this.setValue(""); }')
  )
  output$company <- renderUI({
    datasetList <- c("Select All", as.character(unique(sort(cms_factor_dt$company))))
    selectizeInput("company", "Select Company",
                   datasetList, multiple = FALSE, options = PLACEHOLDERLIST2, selected = "Select All")
  })
  output$searchlhs <- renderUI({
    textInput("searchlhs", "Search LHS", placeholder = "Search")
  })
  output$searchrhs <- renderUI({
    textInput("searchrhs", "Search RHS", placeholder = "Search")
  })
  output$support2 <- renderUI({
    sliderInput("support2", label = 'Support', min = 0, max = 0.04, value = 0.01, step = 0.005)
  })
  output$confidence <- renderUI({
    sliderInput("confidence", label = 'Confidence', min = 0, max = 1, value = 0.5)
  })
  output$lift <- renderUI({
    sliderInput("lift", label = 'Lift', min = 0, max = 10, value = 0.8)
  })
  dataInput <- reactive({
    print(input$support2)
    print(input$company)
    print(identical(input$company, ""))
    temp <- cms_rules_dt[support > input$support2 & confidence > input$confidence & lift > input$lift]
    if (!identical(input$searchlhs, "")) {
      searchTerm <- paste0("*", input$searchlhs, "*")
      temp <- temp[LHS %like% searchTerm]
    }
    if (!identical(input$searchrhs, "")) {
      searchTerm <- paste0("*", input$searchrhs, "*")
      temp <- temp[RHS %like% searchTerm]
    }
    if (!identical(input$company, "Select All")) {
      temp <- temp[grepl(input$company, rules)]
    }
    temp[, .(LHS, RHS, support, confidence, lift)]
  })
  output$downloadMatchingRules <- downloadHandler(
    filename = "Rules.csv",
    content = function(file) {
      write.csv(dataInput(), file, row.names = FALSE)
    }
  )
  output$result <- renderDataTable({
    z = dataInput()
    if (nrow(z) == 0) {
      z <- data.table("LHS" = '', "RHS" = '', "Support" = '', "Confidence" = '', "Lift" = '')
    }
    setnames(z, c("LHS", "RHS", "Support", "Confidence", "Lift"))
    datatable(z, options = list(scrollX = TRUE))
  })
}
shinyApp(ui = ui, server = server)
4.4 使用自定义 CSS 和字体

为了让应用程序有更好的外观和感觉,我们可以使用自定义 CSS 文件和字体。从软件仓库下载自定义 CSS 文件,并将 CSS、字体和其他相关文件存储在创建 R Shiny 应用程序目录下的 www 文件夹中。

4.5 运行应用程序

如果一切顺利,点击页面顶部的“Run App”选项即可运行应用程序。运行后,用户会看到一个弹出窗口,应用程序有多个控件:
- Search LHS/RHS :在规则的左侧或右侧输入要过滤的文本。
- Support :表示规则在数据集中的流行程度。
- Confidence :规则中精确匹配的比例。
- Lift :定义规则重要性的变量,大于 1 的值被认为是显著的。

这个应用程序可以用于处理其他规则文件,只要它们的处理方式与上述 R 脚本部分类似。

5. 企业数据科学

在现实世界中,数据集通常比家庭使用的数据集大得多。传统上,我们依赖 SQL Server、Oracle 等知名数据库技术进行组织数据仓库和数据管理。然而,NoSQL 和基于 Hadoop 的解决方案的出现改变了这种运营模式。如今,大多数大型组织都采用一种或多种非传统的现代解决方案来满足企业数据需求。

云计算的出现也改变了大多数企业的运营方式,内部数据中心正迅速被基于云的基础设施所取代。云市场的主要领导者包括亚马逊(Amazon Web Services)、微软(Azure)和谷歌(Google Compute Engine)。数据仓库、数据科学和机器学习需求主要在这些平台上实现。

接下来,我们将介绍企业中用于大数据和机器学习的各种技术平台,讨论云计算的优点以及它们如何影响企业软件和硬件堆栈的选择。同时,还会有一个使用 AWS 试用账户按需启动新实例的教程。

综上所述,机器学习和企业数据科学在当今的技术领域中扮演着重要角色。通过深入理解各种机器学习算法和技术平台,我们可以更好地处理和分析大规模数据,为企业决策提供有力支持。在未来的发展中,随着数据量的不断增加和技术的不断进步,这些领域将继续迎来新的挑战和机遇。

机器学习深度探索与企业数据科学实践

6. 企业常用技术平台分析

在企业数据科学领域,有多种技术平台可供选择,每种平台都有其独特的优势、适用场景和潜在问题。以下是一些常见平台的详细分析:

平台类型 代表产品 优势 适用场景 潜在问题
传统数据库 SQL Server、Oracle 成熟稳定,有强大的事务处理能力和丰富的工具支持,广泛应用于企业级数据管理。 适用于对数据一致性和事务处理要求高的场景,如金融交易系统、企业资源规划(ERP)系统等。 扩展性有限,对于大规模数据的处理和存储成本较高,在处理非结构化数据方面能力较弱。
NoSQL 数据库 MongoDB、Cassandra 具有高可扩展性和灵活性,能够处理各种类型的数据,包括结构化、半结构化和非结构化数据。 适合处理大规模、高并发数据,如社交媒体数据、物联网传感器数据等。 缺乏统一的标准,数据一致性模型相对较弱,在复杂查询方面的性能不如传统数据库。
Hadoop 生态系统 Hadoop、Spark 能够处理海量数据,具有分布式存储和计算能力,支持多种数据处理框架。 适用于大数据分析、数据挖掘等场景,如日志分析、推荐系统等。 系统复杂度较高,运维成本较大,对硬件资源要求较高。
云计算平台 Amazon Web Services(AWS)、Microsoft Azure、Google Compute Engine 提供弹性的计算资源和存储服务,降低了企业的硬件成本和运维负担,具有高可用性和可扩展性。 适合各种规模的企业,尤其是需要快速部署和灵活扩展的场景,如初创企业的应用开发和测试。 对网络依赖较大,存在数据安全和隐私问题,长期使用成本可能较高。
7. 云计算对企业软件和硬件堆栈选择的影响

云计算的发展对企业软件和硬件堆栈的选择产生了深远的影响,主要体现在以下几个方面:

  • 成本效益 :云计算采用按需付费的模式,企业无需购买大量的硬件设备和软件许可证,降低了前期投资成本。同时,云计算平台的弹性计算资源可以根据企业的业务需求进行灵活调整,避免了资源的浪费,提高了成本效益。
  • 可扩展性 :企业可以根据业务的增长或变化,快速增加或减少云计算资源的使用,实现无缝扩展。这种灵活性使得企业能够更好地应对市场变化和业务挑战。
  • 技术创新 :云计算平台提供了丰富的工具和服务,如机器学习平台、大数据分析工具等,企业可以利用这些资源进行技术创新,加快产品和服务的开发速度。
  • 数据安全和合规性 :云计算服务提供商通常具有专业的安全团队和完善的安全措施,能够提供更高水平的数据安全保障。同时,他们也会遵守各种行业标准和法规,帮助企业满足合规性要求。

然而,企业在选择云计算平台时也需要考虑一些因素,如数据安全、隐私保护、供应商锁定等问题。因此,企业需要综合评估自身的需求和云计算平台的特点,做出合适的选择。

8. 使用 AWS 按需启动新实例教程

以下是使用 AWS 试用账户按需启动新实例的详细步骤:

  1. 注册 AWS 试用账户

    • 访问 AWS 官方网站(https://aws.amazon.com/),点击“创建 AWS 账户”按钮。
    • 按照提示填写个人信息、联系方式和付款信息,完成账户注册。注册过程中需要提供有效的信用卡信息,但在试用期内不会产生费用。
  2. 登录 AWS 管理控制台

    • 注册成功后,使用注册的用户名和密码登录 AWS 管理控制台。
  3. 启动新实例

    • 在管理控制台中,找到“EC2(弹性计算云)”服务并点击进入。
    • 在 EC2 控制台中,点击“实例”选项卡,然后点击“启动实例”按钮。
    • 选择 Amazon Machine Image(AMI) :在 AMI 列表中选择适合您需求的操作系统镜像,例如 Amazon Linux、Ubuntu 等。
    • 选择实例类型 :根据您的计算需求选择合适的实例类型,如 t2.micro(适合测试和开发环境)、m5.large(适合生产环境)等。
    • 配置实例详细信息 :设置实例的数量、存储容量、网络配置等参数。您可以使用默认设置,也可以根据需要进行自定义配置。
    • 添加存储 :根据需要为实例添加额外的存储设备,如 EBS 卷。
    • 添加标签 :为实例添加标签,以便更好地管理和识别。
    • 配置安全组 :安全组用于控制实例的网络访问权限。您可以创建一个新的安全组,允许特定的 IP 地址或端口访问实例。
    • 审查和启动 :检查实例配置信息,确认无误后点击“启动”按钮。
    • 选择密钥对 :在启动实例时,您需要选择一个密钥对来访问实例。如果您没有密钥对,可以创建一个新的密钥对并下载私钥文件。
  4. 连接到实例

    • 实例启动后,等待几分钟直到状态变为“运行中”。
    • 使用 SSH 客户端(如 PuTTY)连接到实例。在连接时,需要使用之前下载的私钥文件和实例的公共 IP 地址。

以下是使用 SSH 连接到 Amazon Linux 实例的示例命令:

ssh -i /path/to/your/private-key.pem ec2-user@your-instance-public-ip

通过以上步骤,您就可以使用 AWS 试用账户按需启动新实例,并进行后续的开发和测试工作。

9. 总结与展望

机器学习和企业数据科学在当今数字化时代具有重要的地位。通过深入学习和应用各种机器学习算法,如 K-Means、神经网络等,我们可以更好地处理和分析数据,挖掘数据中的潜在价值。同时,企业在选择数据管理和处理平台时,需要综合考虑传统数据库、NoSQL、Hadoop 以及云计算等多种技术,根据自身的业务需求和发展战略做出合适的选择。

随着数据量的不断增长和技术的不断进步,机器学习和企业数据科学领域将面临更多的挑战和机遇。未来,我们可以期待看到更多创新的算法和技术出现,为企业提供更高效、更智能的解决方案。同时,云计算和大数据技术的发展也将进一步推动企业数字化转型的进程,帮助企业更好地应对市场变化和竞争挑战。

在实际应用中,我们需要不断学习和实践,结合具体的业务场景,灵活运用各种技术和工具,以实现企业的目标和价值。希望本文能够为您在机器学习和企业数据科学领域的学习和实践提供一些有益的参考。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值