
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
library(dplyr) #數據處理使用
library(data.table) #數據讀取使用
library(caTools) #LR模型使用
library(pROC) #繪圖使用
library(ggplot2) #繪圖使用
library(ggpubr) #繪圖使用
library(ggprism) #繪圖使用
# 讀取數據
data <- fread("./ML_data.txt",data.table = F) # 替換為你的數據文件名或路徑
數據長這個樣子,一共35727行,214列。每一行代表一個樣本,第一列是樣本標簽”cluster1或cluster2″,后面213列是213個特征。我們想根據213個特征,使用LR模型訓練出一個能夠對樣本進行精準分類。
數據情況
# 將第一列數據轉換成1或0,分別代表cluster1和cluster2
data <- data %>% mutate(cluster = ifelse(cluster=="cluster1",1,0))
# 分割數據為訓練集和測試集
set.seed(123) # 設置隨機種子,保證結果可復現
split <- sample.split(data$cluster, SplitRatio = 0.8) # 將數據按照指定比例分割
train_data <- subset(data, split == TRUE) # 訓練集
test_data <- subset(data, split == FALSE) # 測試集
# 構建邏輯回歸模型
model <- glm(cluster ~ ., data = train_data, family = binomial)
# 查看模型摘要
summary(model)
在邏輯回歸模型中,可以通過查看模型摘要來獲取每個特征的重要性指標。邏輯回歸模型的摘要通常提供了特征的系數(coefficient)或權重(weight),用于衡量每個特征對預測的貢獻程度。
模型摘要
# 預測
predictions <- predict(model, newdata = test_data, cluster = "response")
# 將預測結果轉化為二分類(0和1)
threshold <- 0.5 # 設置閾值
predicted_classes <- ifelse(predictions >= threshold, 1, 0)
# 模型評估
confusion_matrix <- table(test_data$cluster, predicted_classes)
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
precision <- confusion_matrix[2, 2] / sum(confusion_matrix[, 2])
recall <- confusion_matrix[2, 2] / sum(confusion_matrix[2, ])
f1_score <- 2 * precision * recall / (precision + recall)
# 打印評估指標
print(confusion_matrix)
cat("Accuracy: ", accuracy, "\n")
cat("Precision: ", precision, "\n")
cat("Recall: ", recall, "\n")
cat("F1 Score: ", f1_score, "\n")
混淆矩陣
模型評價指標
從這些指標來看,我們構建的LR模型可以很好的對樣本進行分類,下面我們來繪制一下ROC曲線和混淆矩陣圖。
ROC(Receiver Operating Characteristic)曲線和AUC(Area Under the Curve)是評估二分類模型性能常用的指標。
# 計算ROC曲線指標
roc_obj <- roc(test_data$cluster, predictions)
roc_auc <- auc(roc_obj)
# 將ROC對象轉換為數據框
roc_data <- data.frame(1 - roc_obj$specificities, roc_obj$sensitivities)
# 繪制ROC曲線
ggplot(roc_data, aes(x = 1 - roc_obj$specificities, y = roc_obj$sensitivities)) +
geom_line(color = "#0073C2FF", size = 1.5) +
geom_segment(aes(x = 0, y = 0, xend = 1, yend = 1), linetype = "dashed", color = "gray") +
geom_text(aes(x = 0.8, y = 0.2, label = paste("AUC =", round(roc_auc, 2))), size = 4, color = "black") +
coord_cartesian(xlim = c(0, 1), ylim = c(0, 1)) +
theme_pubr() +
labs(x = "1 - Specificity", y = "Sensitivity") +
ggtitle("ROC Curve") +
theme(plot.title = element_text(size = 14, face = "bold"))+
theme_prism(border = T)
混淆矩陣提供了對分類模型性能的全面評估。它展示了實際類別和預測類別之間的對應關系,可以清晰地看到模型的預測結果中真正例、真反例、假正例和假反例的數量或比例。繪制混淆矩陣可以將復雜的分類結果以直觀的方式展示出來,使得結果更易于理解和解釋。
# 創建混淆矩陣數據
confusion_matrix <- table(test_data$cluster, predicted_classes)
# 將混淆矩陣轉換為數據框
confusion_matrix_df <- as.data.frame.matrix(confusion_matrix)
colnames(confusion_matrix_df) <- c("cluster1","cluster2")
rownames(confusion_matrix_df) <- c("cluster1","cluster2")
## 這里計算的是比例,也可以使用具體數量,個人感覺比例能夠直觀的展示
draw_data <- round(confusion_matrix_df / rowSums(confusion_matrix_df),2)
draw_data$real <- rownames(draw_data)
draw_data <- melt(draw_data)
# 繪制混淆矩陣熱圖
ggplot(draw_data, aes(real,variable, fill = value)) +
geom_tile() +
geom_text(aes(label = scales::percent(value))) +
scale_fill_gradient(low = "#F0F0F0", high = "#3575b5") +
labs(x = "True", y = "Guess", title = "Confusion matrix") +
theme_prism(border = T)+
theme(panel.border = element_blank(),
axis.ticks.y = element_blank(),
axis.ticks.x = element_blank(),
legend.position="none")
文章轉自微信公眾號@Bio小菜鳥