A.关于数据
B.数据探索
b1.番名
b2.季数
b3.集数
b4.年份
b5.季节
b6.来源
b7.类别
b8.制作公司
b9.评分及人数
extra 1.个人、豆瓣与MAL的对比
b0.声优
extra 2.声优关系网络
C.建模与评估
c1.清洗数据
c2.创建训练数据集和测试数据集
c3.朴素贝叶斯算法
c4.规则学习算法
D.局限与展望
花费许多时间学到的东西自然是要用一用的,如果工作中用不到的话,那就用来为生活增添些许乐趣吧。
看番多年,难免遇到烂番,既浪费时间,又影响心情;另外,有些优秀的番剧,可能因为某些原因,与自己失之交臂。要是能在自己看过的番剧的基础上,建立一个模型,帮自己避免烂番,发掘好番,那真是再好不过了。于是我就把自己近年来看过的番剧整理了一下,收集了若干相关信息,做成了excel表格,作为建立模型的原材料。数据是手动整理的,花费的时间比我预计的多很多,但在整理的过程中,也引发了不少回忆,所以也算不上是浪费时间。
A.关于数据
数据就是我看番的记录,不全,但应该是足够用了。反应变量是我对某番剧的评分,从5分到10分,是离散数据,在这第一次尝试中,计划将其变为二元分类数据,即5分到7分为不推荐,8分到10分为推荐。预测变量有十来个,包括番剧的年代、类型、制作公司、声优和网站评分等信息,在第一次尝试中,计划把数据弄成稀疏矩阵,使用朴素贝叶斯算法和规则学习算法来进行分类。
在查看数据之前,先载入分析需要用到的包:
library(tidyverse)
library(readxl)
library(here)
library(ggthemes)
library(corrplot)
library(tidytext)
library(widyr)
library(igraph)
library(ggraph)
library(e1071)
library(RWeka)
library(gmodels)
然后导入数据,并进行初步的清洗:
anime <- read_xlsx(here('content', 'post', 'data', 'anime_record.xlsx')) %>%
mutate_all(str_remove_all, pattern = '\U00A0') %>% # 去掉不间断空格<U+00A0>
select(-record_time) %>%
mutate(studio = str_remove(studio, ',.*')) %>%
mutate_at(vars(c('season_number', 'episode', 'year', 'rating', 'db_number', 'mal_number')), as.
书中的第二个例子是利用朴素贝叶斯算法判断垃圾短信。
首先载入需要用到的包:
library(tidyverse) # 清洗数据
library(here) # 设置数据文件路径
library(tidytext) # 分词及创建稀疏矩阵
library(e1071) # 建模
library(gmodels) # 评估模型
在清洗数据的时候遇到一定的困难,因为书中是用tm包进行文本处理的,而我完全没有用过这个包(甚至也没有装这个包),所以看书中的代码就只能凭感觉脑补了。不过,还好,最后还是成功写出了tidyverse化的数据清洗代码,如下:
sms <- read_csv(here('content', 'post', 'data', '02-sms_spam.csv')) %>% mutate(type = factor(type),
row = row_number()) %>% unnest_tokens(word, text) %>% anti_join(stop_words) %>% filter(!str_detect(word, '\\d')) %>% cast_sparse(row, word) %>% as.matrix() %>% as_tibble() %>% select(which(colSums(.) > 4)) %>% bind_cols(read_csv(here('data', '02-sms_spam.csv')) %>% mutate(type = factor(type),
row = row_number()) %>% unnest_tokens(word, text) %>% anti_join(stop_words) %>% filter(!str_detect(word, '\\d')) %>%
select(-3) %>% distinct()) %>% mutate_if(is.
通过将《机器学习与R语言》一书中的代码tidyverse化,来学习这本书。
书中第一个例子是利用kNN算法来诊断乳腺癌。
首先载入需要用到的包:
library(tidyverse) # 清洗数据
library(here) # 设置数据文件路径
library(knitr) # 呈现更好看的表格
library(kableExtra) # 同上
library(class) # 使用包中的knn()函数
library(gmodels) # 使用包中的CrossTable()函数
然后导入数据并清洗:
wbcd <- read_csv(here('content', 'post', 'data', '01-wisc_bc_data.csv')) %>% select(-id) %>% mutate(diagnosis = factor(diagnosis, levels = c('B', 'M'),
labels = c('Benign', 'Malignant'))) %>% mutate_if(is.numeric, ~ (.x - min(.x)) / (max(.x) - min(.x)))
首先使用here函数找到数据文件的路径,然后使用read_csv函数将其读入R中;随后通过select函数将id变量去掉;然后利用mutate函数将diagnosis变量改为因子型;最后利用mutate_if函数,将所有数值型的变量进行min-max标准化,这里用到了公式化的匿名函数,可以使代码更为简练。此时的数据是这样的:
wbcd %>% head() %>% kable() %>% kable_styling(bootstrap_options = "striped", font_size = 12) %>%
scroll_box(width = "100%")
diagnosis
radius_mean
texture_mean
perimeter_mean
area_mean
smoothness_mean
compactness_mean
concavity_mean
concave points_mean
symmetry_mean
fractal_dimension_mean
radius_se
texture_se
perimeter_se
area_se
smoothness_se
compactness_se
concavity_se
concave points_se
symmetry_se
fractal_dimension_se
radius_worst
texture_worst
perimeter_worst
area_worst
smoothness_worst
compactness_worst
concavity_worst
concave points_worst
symmetry_worst
fractal_dimension_worst
Malignant
0.