根据姓名分类性别(以及可能的年龄范围)

在尝试将数据集(以CSV格式)上传到H2O时,我发现FirstName列被转换为null/缺失值,我了解到当前版本的H2O不支持字符串类型的列,且因子类型最多只能处理65k个唯一值。因此,我现在正在寻找另一种解决这个问题的方法。

我希望最终得到一个模型,给定任何FirstName,它将返回以下信息:

  • 该人是男性/女性的概率(+1.0到-1.0)
  • 如果可能的话,该人的可能年龄(均值,标准差)

哪些R函数(或包::函数)可以用于此目的?最好是文档齐全的包/函数,以便我可以在使用过程中学习更多知识。

这是R中数据集的一个样本。列类型为:数值,因子,因子,数值。

> head(TrainingNames)  Year FirstName Gender Freq1 1880      Mary      F 70652 1880      Anna      F 26043 1880      Emma      F 20034 1880 Elizabeth      F 19395 1880    Minnie      F 17466 1880  Margaret      F 1578> summary(TrainingNames)      Year        FirstName       Gender           Freq         Min.   :1880   Francis:    268   F:1062432   Min.   :    5.0   1st Qu.:1948   James  :    268   M: 729659   1st Qu.:    7.0   Median :1981   Jean   :    268               Median :   12.0   Mean   :1972   Jesse  :    268               Mean   :  186.1   3rd Qu.:2000   Jessie :    268               3rd Qu.:   32.0   Max.   :2013   John   :    268               Max.   :99674.0                  (Other):1790483                                

这是用于提取/处理数据源的R代码。

# 创建数据目录,下载并解压数据源dir.create('Data Files', showWarnings = F)if(!file.exists('Data Files/names.zip')) {  download.file(url = 'http://www.ssa.gov/oact/babynames/names.zip', destfile = 'Data Files/names.zip', cacheOK = T)  setwd('Data Files/')  unzip(zipfile = 'names.zip')  setwd('../') }FileList <- list.files(path = "Data Files/", pattern = ".txt") # 数据文件列表# 为R/Tableau创建名字数据源munge <- function(f) { # 返回单个数据文件的数据框  y <- as.numeric(gsub(pattern = '[^0-9]', replacement = "", x = f))  l <- read.csv(file = paste0("Data Files/", f), header = F, quote = "'")  d <- cbind(y, l)  colnames(d) <- c("Year", "FirstName", "Gender", "Freq")  return(data.frame(d))}if(!file.exists('TrainingNames.csv')) {  pb <- txtProgressBar(min = 1, max = length(FileList), style = 3) # 开始进度条  TrainingNames <- munge(FileList[[1]]) # 处理第一个数据文件  for(n in 2:length(FileList)) { # 处理剩余的数据文件    TrainingNames <- rbind(TrainingNames, munge(FileList[[n]]))    setTxtProgressBar(pb, n)  }  close(pb) # 关闭进度条  rm(n, pb)  write.table(x = TrainingNames, file = "TrainingNames.csv", sep = ";", row.names = F, col.names = T) # 将结果写入CSV文件}summary(TrainingNames)

回答:

我在这里定义了一个name_stats函数,按照你的要求进行操作。你需要先运行问题中的代码来创建TrainingNames,然后这个函数才能工作。

你可以根据需要进行任何编辑以适应你的具体需求。

name_stats=function(name){    df=subset(TrainingNames,FirstName==name)    gender=tapply(df[,'Freq'],df[,'Gender'],sum)    prob_male=gender['M']/sum(gender)    prob_female=gender['F']/sum(gender)    age=tapply(df[,'Freq'],as.factor(df[,'Year']),sum)    dimnames(age)=list(age=round((Sys.Date()-as.Date(unlist(dimnames(age)),format='%Y'))/365))    mean_age=mean(rep(as.numeric(unlist(dimnames(age))),age))    sd_age=sd(rep(as.numeric(unlist(dimnames(age))),age))    cat('Probability',name,'is male is',round(prob_male,6),'\n','Probability',name,'is female is',round(prob_female,6),'\n','Mean age of',name,'is',round(mean_age,6),'\n','SD age of',name,'is',round(sd_age,6))}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注