从学术界到工业界的建议
我学到的从学术界转移到数据科学工作行业的经验
Unsplash
我职业生涯早期是一名学者,在工业界工作了十年。我在公司环境中做的许多事情经常让我想起学术生活。我阅读大量的工业发展文章(有时是研究论文),指导人们的职业发展(有时是研究生),在真实数据(有时是玩具数据集)上试验不同的技术,为商业客户写建议书(不再有研究拨款),写演示文稿(不是为了在课堂上教学生)。
我希望我的一些经验可以帮助你避免陷阱,平稳过渡。
做好准备。这是艰难的
总的来说,我相信从生命的早期开始就没有容易的转变。我仍然记得当保育员向我解释如何让婴儿从婴儿室过渡到学步室时。从学术界转到工业界并不容易,可能比换领域要难得多。在学术界呆的时间越长,跳槽就越难。这也是一种生活方式的改变,会引起不适。这可能比你预期的要长得多,而且你可能会面临一些文化冲击。所以,你应该做好准备,告诉自己这将是艰难的。
搬家前先试一试
当你还在校园工作的时候,不管你是做研究,还是做教学,或者两者兼而有之,你都应该尝试着去涉足行业工作。你应该寻找机会,利用来自行业合作伙伴的真实数据进行研究项目,以解决真实的行业问题。问题和数据可能很小或定义很窄,但它仍然会为您提供学习业务逻辑和了解行业的机会。有时你会有机会在公司工作或参观公司,并与业内人士直接接触。如果你的重点是教学,试着成为基于行业的学习、教学和课程开发的一部分。在这两个场景中,你将接触到在工业领域工作的人,并接触到真实的工业商业案例。以我的经验来看,这些都是非常有价值的经历,它们会帮助你决定是否真的想搬家。
按照行业风格准备你的简历,去掉你的出版物
经过几轮求职后,你会收集到一份你感兴趣的职位空缺清单。在您点击“上传”提交您的简历之前,请检查您的简历是否超过两页,或者是否包含您所有出版物的一页。当我要求扔掉你完成的出版物和资助时,我完全理解你的感受。我还记得有一段时间我觉得这是我简历上除了学位以外唯一具体的东西。把它们拿走!把它们变成你学术成就的总结,你已经发表了许多有声望的期刊论文。不过,我有一份我的学术简历作为纪念。你应该做的是将你在研究、项目和教学中所做的转化为行业雇主所渴望的技能清单。例如,突出你的团队工作,时间管理,演示,分析,沟通技巧。只有当你的专业技能相关时,才包括在内。
上 LinkedIn,参加聚会,和招聘人员交流
申请一个网上的职位空缺不足以实现你从学术界转向工业界的目标。即使你积极申请很多工作,回复率也可能非常低。如果你是那种刻板的内向者,不太想亲自或在社交聚会上与人交谈,那么一定要利用 LinkedIn 这样的专业社交平台,发布你的知识,分享你的技能,你会得到未来雇主的注意。如果你乐于参加社交活动,你可以参加很多聚会,在那里你可以亲自与人建立联系。不要忘了和招聘人员谈谈。他们可以帮助你进入一个你从未考虑过的目标市场。
找一个导师或者以前做过这个的人
找一个做过过渡的导师不容易,但是你要尽量找一个以前做过过渡的人,寻求建议。即使这个人不是和你在同一个领域工作,他们的经验仍然是非常相关和有用的。当你从一次失败的面试中得到的一些评论让你感到沮丧或困惑时,你可以向那个人寻求反馈,以确认你所做的事情是否正确。你的错误可能是每个人在尝试跳跃时都会犯的。如果你能找到一个和你同领域的人,特别是你已经认识并信任的人,他们可能会帮助你制定适合你情况的策略。
选择一家有 R&D 的公司来轻松过渡
在你的行业中有许多不同类型的公司,从咨询公司到公司,再到初创公司。以我的经验来看,与直接跳到咨询或商业公司相比,加入一家公司的 R&D 能让你更平稳地过渡。尽管许多 R&D 机构做的开发比研究多得多,但 R&D 的各个部门仍在学术风格的商业环境中运作,这种环境远没有企业那么正式。你可以避免大的文化冲击,并经常找到像你一样从学术界转到工业界的人。
选择一个老板,也许不是一个完美的职位描述
假设你面前有两个类似的机会:一个提供的职位描述对你的梦想来说并不完美,但足够接近你想做的事情,但你觉得未来的老板会欣赏你的技能,看到你的潜力;另一个职位有一个完美的描述,但你不会真正感受到未来老板的共鸣。我建议你挑能理解并看到你身上价值的老板。从学术界到工业界的转变更多的是在工作方式、思维和风格上,而不是你将要做的实际任务上。你可能会发现,工业界的工作不像你在学术界做的项目和任务那样被狭隘和严格地定义,而且会有很大的发展和变化的灵活性。最重要的是,好老板会给你探索的空间。
用足够的时间试一试,并从中学习
恭喜你!你锁定了一个机会,你准备从学术界进入工业界。当我听到你们中的一些人发现这太难适应或者这对你们来说不够有智力挑战时,我不会感到惊讶。不管你的感受是什么,请不要太快下结论。你的第一份行业工作会给你一个分析利弊的基线,接下来的转变会容易得多。
数据科学是一个有利于快速向产业跃升的领域吗?
这个主题可以单独成为一篇文章。数据科学家职位的数量正在快速增长,博士学位在候选人要求上得到了高度认可,这当然让许多离开学术界的人认为他们比其他候选人更具竞争力。然而,这也可能会产生误导,因为博士学位并不是选择标准中最重要的东西,也有更多的候选人申请。如果你对商业、编码、数据、解决问题和不断学习新事物感兴趣,你可以成为一名伟大的数据科学家。有很多材料、课程、竞赛和开源项目,如果你愿意投资,还有很多机会。只是不要以为,因为你有博士学位,你就自动比任何人都优秀。
所有的建议纯粹是基于我自己的经验,可能不适用于你的情况,但希望你会发现一些有用的东西。祝你顺利过渡。
这篇文章在 LinkedIn 上也有。
确保数据科学和产品管理之间成功关系的提示
来自 NeuroFlow 团队的建议,neuro flow 是一家医疗保健技术和分析公司,致力于在整个护理过程中实现行为健康访问和参与
Speaking on a panel at Comet.ml meetup with Bill Lynch, Michelle Morgenbesser and Jean-Francois B. Guertin
上个月,我们的首席数据科学家 Bill Lynch 和我应邀参加了由 Comet.ml 在纽约举办的专题讨论会,讨论数据科学和产品团队如何合作。作为一家医疗保健软件和分析公司的产品负责人,我已经迫不及待地报名了。此次活动以热烈的讨论和有趣的问题为标志,涵盖了技术公司中关于这两个关键业务部门如何成功合作的新兴话题。比尔和我总结了我们在 NeuroFlow 工作期间与观众分享的一些经验教训:
项目选择本来就是协作的
数据科学触及业务的每个部分,推动产品组织中一些最高价值的计划。因此,我们发现位于产品和数据科学之间的项目通常需要其他利益相关者的支持。与这些其他功能的对话可能发生在不同的时间(例如,优先级和范围批准来自领导层,架构可能来自工程),但是它们是帮助项目向前发展并朝着正确的方向前进的关键,最终为业务交付价值。
尽早并经常传达价值
不管是好是坏,移动目标通常与数据科学计划相关联;这就是为什么考虑到这些努力的较长时间线,展示进展是重要的——什么可行和什么不可行可能与构建事物本身一样重要。我们发现,每两周向公司的相关利益相关者分享数据科学里程碑、阻碍因素和项目更新有助于实现这一目标,并让人们提出我们可能没有想到的问题。
取得正确的平衡
我们注意到一种模式,工程师解决已定义的问题,而数据科学家解决未定义的问题。因此,为实质性的人工智能项目做一些适当的客户发现是很重要的。走出去问客户,你正在考虑的机器学习模型或算法是否会真正有用,为他们解决一个关键问题。考虑到我们在时间和资源上的限制,我们不能花费数周的时间来开发一些东西,然后从客户那里听到,“嗯,这很有趣,但是我真正需要的是这个或那个。”最终用户不仅需要获得模型的结果,还需要能够直观地知道它在做什么以及为什么做。这并不容易,但你需要在进入有趣和好玩的兔子洞之间取得平衡——这有时会带来创新和突破——同时带来即时价值。
测量是关键
以定量的方式监控数据科学工作至关重要。我们将 NeuroFlow 的数据科学项目指标分为三个不同的类别:
- 业务指标(即收入目标)
- 产品指标(即应用下载和使用)
- 模型指标(即精确度、F1 分数)
我们的使命是弥合身体和精神健康之间的差距,适当的数据科学将成为实现这一目标的催化剂。我们希望这些提示能帮助其他公司在数据科学和产品之间的微妙但重要的动态中导航。我们错过或忘记什么了吗?请通过评论或联系 julia@neuroflowsolution.com 让我们知道。
关于神经流:
NeuroFlow 是一家医疗保健技术和分析公司,致力于在整个护理过程中实现行为健康访问和参与。NeuroFlow 结合了经过验证的技术、数据科学和行为经济学,允许数百家诊所、卫生系统和提供商使用循证实践客观地评估、跟踪和吸引患者,以支持他们的精神健康。欲了解更多信息,请访问www.neuroflowsolution.com。
多元线性回归的技巧和窍门
收集分析数据、诊断模型和可视化结果的方法
这个分析是我决定在学校回归分析模块中承担的一个项目。我已经学习并收集了几种方法,你可以在 R 中使用,使你的分析更深入。像往常一样,我总是自学最有发现的东西。
数据
回应变量:承认的机会
预测因素:GRE 成绩,托福成绩,大学评级,SOP,LOR,CGPA,研究
图书馆
library(dplyr);
library(ggplot2);
library(GGally);
library(vioplot);
library(corpcor);
library(ppcor);
library(mctest);
library(ggfortify);
library(lmtest);
library(MASS);
library(car);
library(DAAG);
library(jtools);
library(relaimpo);
描述性统计
summary(df)
分布图
par(mfrow=c(4, 2))
colnames = names(df)
for(name in colnames) {
vioplot(df[name], horizontal=TRUE, col='gold', lineCol='gold', lty=0, colMed='floralwhite', yaxt='n',rectCol='dodgerblue4')
title(main=name)
}
There is no extreme skew for the variables. this makes the confidence intervals for estimating parameters for our predictors and estimating the mean response more meaningful.
检查 1)DV 和每个 iv 之间的线性 2)iv 之间的多重共线性
ggpairs(df, progress=FALSE)
From the last row, we can observe that most of the IVs seem to have a linear relationship with our response variable except for the binary variable Research. Therefore the assumption for linearity between DV and each of IVs hold.
所有变量的成对相关性都相当高。这似乎违反了多元线性回归没有多重共线性的假设。
偏相关系数
考虑到其他预测因素的混杂效应。
pcorr = as.data.frame(cor2pcor(cov(df)))
names(pcorr) = names(df)
rownames(pcorr) = names(df)
pcorr = format(pcorr, digits=1)
print.data.frame(pcorr)
The partial correlation coefficients suggest otherwise, that there is less multicollinearity with only GRE.Score & TOEFL.Score having a value > 0.4. Partial correlation between CGPA and our response variable Chance.of.Admit is fairly high but it does not violate the “No Multicollinearity between its IVs assumption” of MLR.
使用个别多重共线性诊断测量
imcdiag(df[,1:7],df$Chance.of.Admit)
All the predictors have a VIF (=1/(1-R²)) value of <5 which indicates that the multicollinearity is not so problematic.
安装 MLR
fit = lm(Chance.of.Admit ~ ., data=df)
summary(fit)
Fit: Chance.of.Admit = -1.28 + 0.00186(GRE.Score) + 0.00278(TOEFL.Score) + 0.00594(University.Rating) + 0.00159(SOP) + 0.0169(LOR) + 0.118(CGPA) + 0.0243(Research) (3s.f.)
这表明平均而言,GRE 每增加一个单位。分数/托福。分数/大学。Rating/SOP/LOR/CGPA/Research 在保持所有其他变量不变的情况下,将录取机会增加 0.00186/0.00278/0.00594/0.00159/0.0169/0.118/0.0243。
F 统计量的 p 值是<2.2e-16, indicating that we can reject the null hypothesis that the intercept-only model is the same fit as the MLR model even at alpha=0.001. Therefore, the MLR model is highly statistically significant at the 0.01 significance level.
The Adjusted R-squared: 0.8194 is high which suggests that the model is a good fit.
The coefficients for GRE.Score, TOEFL.Score, LOR, CGPA, Research are statistically significant at alpha=0.01 where the respective pvalues < 0.01 as we reject the null that their coeffs is 0 at the 0.01 significance level.
The coefficients for University.Rating (0.118) and SOP (0.728263) are > 0.01,我们无法在 0.01 的显著性水平上拒绝它们的系数为 0 的空值。
模型诊断
autoplot(fit)
(1)残差 vs 拟合
蓝线(每个拟合值的残差平均值)几乎是平的。这表明残差没有明显的非线性趋势。残差看起来是随机分布的,但当接近较高的拟合值时,它会收敛。这似乎是方差的减少,它违反了 MLR 的同方差假设。
bptest(fit)
Using the Breusch-Pagan test, we can reject the null hypothesis at the 0.05 significance level that variance of the residuals is constant and infer that heteroscedasticity is present. Therefore, this makes our coefficient estimates less precise and increases the likelihood that the estimates are further from the true population value.
(2)正常 Q-Q (分位数-分位数图)
残差似乎偏离较低尾部的对角线很多。残差的分布向左倾斜。这表明 MLR 模型对残差正态性的假设被违反。
使用 Box-Cox 幂变换变换响应变量,使其正常并处理异方差
bc = boxcox(Chance.of.Admit ~ ., data=df);
The procedure identifies an appropriate exponent (Lambda = l) to use to transform data into a “normal shape. The Lambda value indicates the power to which all data should be raised and it is suggested to use lambda=2.
lambda = bc$x[which.max(bc$y)]
powerTransform <- function(y, lambda1, lambda2 = NULL, method = "boxcox") {
boxcoxTrans <- function(x, lam1, lam2 = NULL) {
# if we set lambda2 to zero, it becomes the one parameter transformation
lam2 <- ifelse(is.null(lam2), 0, lam2)
if (lam1 == 0L) {
log(y + lam2)
} else {
(((y + lam2)^lam1) - 1) / lam1
}
}
switch(method
, boxcox = boxcoxTrans(y, lambda1, lambda2)
, tukey = y^lambda1
)
}
# re-run with transformation
bcfit <- lm(powerTransform(Chance.of.Admit, lambda) ~ ., data=df)summary(bcfit)
调整后的 R 平方从 0.8194 增加到 0.8471,而预测因子仍然显著。然而,这个模型的可解释性较差,我们希望我们的模型尽可能简洁。我们将在以后探索更多的模型。
(3)残差与杠杆
cooksd <- cooks.distance(fit)
sample_size <- nrow(df)
plot(cooksd, pch="*", cex=2, main="Influential Obs by Cooks distance")
abline(h = 4/sample_size, col="red")
text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>4/sample_size, names(cooksd),""), col="red")
This helps us to find influential outliers. They are points above the dashed line which are not approximated well by the model (has high residual) and significantly influences model fit (has high leverage). By considering Cook’s D > 4/sample size criterion, we identify influential outliers to remove.
移除异常值后重新拟合 MLR
influential = as.numeric(names(cooksd)[(cooksd > (4/sample_size))])
df2 = df[-influential, ]
fit2 = lm(Chance.of.Admit ~ ., data=df2)
summary(fit2)
By removing the highly influential outliers, we refitted the model on the filtered data and the Adjusted R-squared increased to 0.8194 to 0.8916 without introducing complexity to the model.
使用响应变量的函数来拟合模型
fit3 = lm(exp(Chance.of.Admit) ~ ., data=df2)
summary(fit3)
通过回归我们对预测因子的反应指数,我们得到了调整后的 R 平方从 0.8916 增加到 0.9023,而预测因子仍然保持显著性。
通过添加交互项来说明交互
fit4 = lm(exp(Chance.of.Admit) ~ GRE.Score*University.Rating+TOEFL.Score+Research+SOP+LOR+CGPA, data=df2)
summary(fit4)
Interaction arises as the relationship between Chance.of.Admit and the IVs: GRE.Score and University.Rating is affected by the interaction between the GRE.Score & University.Rating. This makes it hard to predict the consequence of changing the value of GRE.Score & University.Rating without controlling for this interaction.
该模型显示了 GRE 之间的显著交互作用。分数&大学。评级为 p 值=0.000799 < 0.001 and is significant at the 0.001 significance level.
Comparing nested models with ANOVA
anova(fit3, fit4)
The first order model is nested within the interaction model. By using ANOVA to compare the simpler first order model vs the more complex model with interaction term, the p-value=0.0007995 is <0.001. The null hypothesis that the reduced simpler model is adequate is rejected at the 0.001 significance level. Therefore, the complex model did significantly improve the fit over the simpler model.
Drop insignificant predictor SOP
fit5 = lm(exp(Chance.of.Admit) ~ GRE.Score*University.Rating+TOEFL.Score+Research+LOR+CGPA, data=df2)
summary(fit5)
Previously, SOP was insignificant at the 0.05 significance level and even after removing it, the model’s Adjusted R-squared is still 0.904.
Variable selection using stepwise model selection by AIC
step <- stepAIC(fit5, direction="both")
A model with fewer parameters is to be preferred to one with more. AIC considers both the fit of the model and the number of parameters used. Having more parameters result in penalty. AIC helps to balance over- and under-fitting. The stepwise model comparison iteratively adds/removes variables one at a time and compares the AIC. The lowest AIC is selected for the final model.
step$anova
In our case, there no further addition or removal of variables required by AIC.
Relative feature importance
calc.relimp(fit5,type="lmg", rela=TRUE)
Relative importance is measured by an algorithm by Lindemann, Merenda and Gold (lmg; 1980) which decomposes total R-squared and observe the increase in R-squared by adding the predictors sequentially. The order of adding predictors matters and therefore, the algorithm takes the average of the R-squared across all orderings.
Relative importance is measured by an algorithm by Lindemann, Merenda and Gold (lmg; 1980) which decomposes total R-squared and observe the increase in R-squared by adding the predictors sequentially. The order of adding predictors matters and therefore, the algorithm takes the average of the R-squared across all orderings.
The features are ranked in this order with highest relative importance first: GRE.Score, CGPA, University.Rating, TOEFL.Score, LOR, Research and GRE.Score*University.Rating.
K-Fold cross-validation results on final model
cv_new = CVlm(data=df2, fit5, m=3, printit=FALSE)attr(cv_new, "ms")[1] 0.007749426
Each of the k-fold model’s prediction accuracy isn’t varying too much for any one particular sample, and the lines of best fit from the k-folds don’t vary too much with respect the the slope and level. The average mean square error of the predictions for 3 portions is 0.00775. The value is low and represents a good accuracy result.
95% CIs for every IV’s estimates
export_summs(fit5, error_format = "[{conf.low}, {conf.high}]", digits=5)
plot_summs(fit5)
Individual CI plots
effect_plot(fit4, pred = CGPA, interval = TRUE, plot.points = TRUE)
I hope this has helped improve your analysis one way or another. Please do not take any of it as a perfect example or as entirely correct and accurate as I am still learning as well. This has certainly liven up my otherwise dull module 😃.
请在 LinkedIn 或通过 jasonyip184@gmail.com 与我进一步讨论!
清理你的 R 代码!更好的特征工程的秘密
by jarmoluk at pixabay.com
使用变异特征设计新的分类
dplyr
中最有用的函数是mutate
;它允许您创建新的变量——通常是通过在数据集中的其他变量之上分层放置一些逻辑。
快速示例
假设您正在分析用户数据,并希望根据使用量对用户进行分类。
您决定需要四个等级——非活动用户、受限用户、健康用户和高级用户。
您的代码可能如下所示。您将在这里看到的是,为了创建新的user_type
变量,我们使用mutate
函数,声明新的变量名,然后利用ifelse
来确定在什么波段下应用不同的值。正如你在下面看到的,如果应用程序中的动作少于 5,这是最低的阈值,那么我们称之为非活动…如果该标准不为真,那么我们将进入下一个ifelse
语句来建立下一组标准。
df %>%
mutate(user_type = ifelse(
app_actions <= 5, 'inactive user', ifelse(
app_actions <= 10, 'limited user', ifelse(
app_actions <= 15, 'healthy user', 'active user' ) ) ) )
虽然ifelse
是一个主要工具并且非常有用,但是当你开始嵌套太多ifelse
时,就会出现一些问题。
- 难以解释和编辑的混乱代码
- 你写了很多多余的代码
我应该补充一下,我上面写的并不太疯狂,但是你可能很快就需要两位数的ifelse
语句,这就产生了我们正在讨论的问题。
case_when
化险为夷
在许多方面,R 比 sql 提供了更多的灵活性,但是也就是说,许多人不必要错过的一个 SQL 命令是case_when
。幸运的是,case_when
实际上是 r 中的一个东西。
查看用case_when
呈现的完全相同的代码片段。
df %>%
mutate(user_type = case_when(
app_actions <= 5 ~ 'inactive user',
app_actions <= 10 ~ 'limited user',
app_actions <= 15 ~ 'healthy user',
TRUE ~ 'active user' ) )
同样,这是一个非常简单的示例,但是当您必须进行二十种条件/值组合时,这可以节省大量时间,并且清晰易读。这里的主要区别在于,左侧实际上是为条件保留的,~
符号用作比较值&之间的分隔符,显然右侧是要给出匹配标准的值。最后一点,TRUE
作为最终的总括,类似于else
语句。
结论
简而言之,虽然ifelse
有它们的位置并且非常有用,但是当你面对无数的ifelse
陈述时,case_when
让一个简单的&变得容易解释。
我希望这在你所有的特性工程工作中对你有用!如果你觉得这有用而且有趣,来看看我们在 datasciencelessons.com 的其他数据科学帖子吧!祝数据科学快乐!
原载于 2019 年 11 月 22 日【http://datasciencelessons.com】。
是时候了:使用决策树来解释模型行为
如何用一个简单的决策树来帮助你理解什么让你的深度模型表现好,什么不好?
在 Taboola,我们每天都在努力改进我们基于深度学习的内容推荐模型。我们使用它每天向数亿用户建议个性化的新闻文章和广告,因此自然地,我们必须坚持最先进的深度学习建模方法。但我们的工作并没有就此结束,分析我们的结果也是必须的,然后我们有时会回到数据科学的根本,应用一些非常基本的技术。
让我们来解决这样一个问题。我们正在研究一个行为相当奇怪的深度模型:对于看起来像是随机的一组广告客户,它赢过了我们的默认模型,而对于另一组广告客户,它输了。这种行为每天都是稳定的,所以看起来可能有一些内在的广告商品质(我们称之为活动特征)要对此负责。您可以在下面看到 4 个活动的典型模型行为。
Daily results for selected campaigns, compared to a baseline of 100%. We can see the new model is very stable. But, how can we predict which campaign is going to succeeded?
因此,我们假设,这场运动的某些因素使得这个模型要么成功,要么失败。会不会是竞选使用的出版商类型?他们的观众规模?他们的每次点击成本?也许所有这些都在一起?圣诞老人还没来帮忙,所以我们应该调查一下!
如果我们认为可能有一个数字特征对此负责,我们可以用 python 编写一个简单的脚本来寻找不同活动特征和我们的标签之间的相关性。但是我们认为这不仅仅是一个竞选特征造成的,而且我们有许多分类特征——所以我们不能简单地联系起来。怎么办?让我们利用机器学习的力量!因此,我们将使用机器学习算法(特别是决策树)来帮助解释我们的深度学习模型结果:
在我们继续之前,您可能会有一些问题:
- 为什么要使用树,而不是像 SHAP 一样使用深度学习解释工具?我们在这里试图隔离活动特征,通用模型使用了许多现在不相关的其他特征(用户特征、上下文特征)。此外,我们可能有更多的元数据可以使用,而不是进入深度模型——比如,活动的语言,它已经运行了多长时间等。
- **为什么要用一棵树,而不是另一个深度模型来解决这个问题呢?**我们寻求最大的可解释性,即使我们的模型不是 100%准确——只要它能指出让我们赢/输的主要疑点。
- **为什么使用简单的决策树,而不是随机森林或 xgboost?**就像上一个问题一样。决策树足够强大,可以抓住主要的坏人,它只有几行代码,你可以绘制它!
- 我们如何选择树的深度?尽量保持简单,如果你认为你可能有 1-3 个主要特征要寻找,深度为 2 的树就足够了。你可以看看深度 3,看看你没有错过什么。再多可能就太多了。
因此,概括一下,我们生成一个包含我们所有活动特征的表格,并添加一个带有 0/1 的标签列,这取决于我们比默认模型做得更好还是更差(这是我们试图预测的)。使用此表来拟合树分类器。然后画出树,看看它找到了什么,或者只看按重要性排序的特征。只需大约 15 行代码就能得到结果,而且你阅读这篇文章的时间也更短。
这项技术最终变得非常有用:如果确实有使模型工作的特征,我们几乎可以立即发现它们。对于我们的情况,我们可以精确地指出我们需要多少流量来积累足够的数据以使我们的模型成功。更重要的是,在其他情况下,如果树只找到嘈杂的无法解释的列,这意味着我们的假设是错误的。
下面是我们粘贴实际代码之前的一些亮点。
- 树可以处理分类特征,但是你必须首先对它们进行编码。不用辛苦自己实现,用下面的熊猫内置函数。
- 小心与你的标签列相关的奇怪的列!记住可解释性是这里的关键——所以如果你突然发现某个随机的分类值在你的决策树上非常高,那很可能是噪音!去掉它,从头开始。
- 不需要在训练和测试之间分割数据,使用一个低的深度应该可以解决过度拟合的问题。
就是这样。有时,简单的解决方案甚至对令人困惑的问题也足够了。树是快速的,可解释的,它们的图形在演示中看起来非常好🙂
祝大家圣诞快乐,节日快乐!
正如承诺的那样,这里是 python 代码示例:
# Imports
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import pandas as pd# Read the files
data = pd.read_csv(“your_file_here.csv”)
label = “your label column”# Split data from label
y = data[label]
X = data.drop(label, axis=1)# Data preprocessing:
# Fill in NaN
X = X.fillna(0)# Turn categorical features to 1 hot encoded columns
X = pd.get_dummies(X)# Fit tree
max_depth=2
classifier = DecisionTreeClassifier(random_state=0, max_depth=max_depth)
classifier.fit(X, y)# Print top 5 features by importance
print(“max depth:”, max_depth)
print(sorted(zip(X.columns, classifier.feature_importances_), key=lambda x: x[1])[-5:])# Plot tree
from sklearn.tree import export_graphviz
import graphviz
export_graphviz(classifier, out_file=”mytree.dot”,feature_names=X.columns)
with open(“mytree.dot”) as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
本帖原载于 2019 年 12 月 18 日 https://engineering.taboola.com**的 。
泰坦尼克号:数据分析中的爱情
《泰坦尼克号》一直是我最喜欢的电影之一。自从这部电影在 1997 年被搬上大银幕以来,我已经看过至少 10 遍了。这部电影本质上是一个爱情故事,围绕着 1912 年在这艘臭名昭著的船上的两个主角。一个 17 岁的贵族在一艘豪华的、命运多舛的船上爱上了一个善良但贫穷的艺术家。
结局浪漫又悲伤。当我们为杰克和罗斯短暂的爱情悲伤时,1912 年泰坦尼克号上其余的 891 名乘客发生了什么?为了回答这个问题,我使用了 Kaggle 的乘客名单数据集,用机器学习算法预测生存或死亡困境。
这是一个比较两种机器学习算法应用结果的简单练习: K 近邻(KNN) 和 随机森林 **。**你可以在这里 找到数据集 的副本来试用。
为什么 KNN 和随机森林?两者都是 二进制分类算法 根据一个对象是否具有某些定性属性的决定,将给定集合的元素标记为两组(预测每组属于哪一组)。两者都是这一类中最流行的算法;其他的只是 KNN 和兰登森林的衍生物。你可以在这里阅读其他二进制分类算法。
当您的问题的答案落在一组有限的可能结果中时,二元分类在数据集上最有效。
一个例子是确定患者是否患有某种疾病的医学测试——分类属性是疾病的存在。在泰坦尼克号数据集中,我的目标是根据一组属性,如年龄、性别、机票等级等,预测乘客是否在悲惨的事故中幸存。这是一个经典的二元分类,因为只有两种可能的结果:生存或死亡。
让我们深入研究代码。请注意,有许多方法可以执行 Python 代码。为了简单和易用,我更喜欢 Python 的 Jupyter 笔记本。
数据准备
第一项任务是从文件中加载训练数据集。Python 提供了一种使用 Pandas 库加载和操作数据集的简单方法。让我们从导入实用程序库和训练数据集开始。
**import** **pandas** **as** **pd**df = pd.read_csv('titanic_dataset.csv')
df.head()
Top 5 rows of the data frame
使用数据集时,一些记录可能不完整。由于我们的示例包含几十年前的数据,因此会有一些信息丢失。
幸运的是,有一些方法可以填补一些缺失的数据。对于所进行的分析,年龄是表征因素之一。因此,数据集包含所有记录的年龄非常重要。下面的代码将从数据集中计算平均年龄,然后用计算出的平均值填充任何缺失的记录。它还会将始发港未知的乘客的港口设置为“S”。
*# Fill the missing age with mean*
mean_age = df['Age'].mean()
df['Age'] = df['Age'].fillna(mean_age)*# Fill the missing embarked port with S*
embarked_port = 'S'
df['Embarked'] = df['Embarked'].fillna(embarked_port)
客舱位置可能会潜在地影响乘客存活率。但是,值的数量不太理想,最好删除。可能其他信息如 PassengerID 和 Name 可能不相关。因此,其他列可以从我们的数据集中删除,因为它们没有增加任何实际价值。
*# Drop Cabin & PassengerID columns*
df = df.drop(['PassengerId', 'Cabin', 'Name'], axis = 1)
尽管人类更喜欢文字,但计算机喜欢和数字打交道。我们数据准备的下一个任务是将人类可读的标签转换成算法可以解释的数字。下面的代码将字符串转换为整数,为每个表示的值添加新列,并根据特定值是否在行中表示,将值 0 或 1 分配给每个列。这将把性别(Sex)和装载列从字符串更改为整数,并将它们作为男性/女性和 CQS(字母代表装载的始发港)添加回数据帧。
df_sex = pd.get_dummies(df['Sex'])
df_em = pd.get_dummies(df['Embarked'])
df2 = pd.concat([df, df_em, df_sex], axis = 1)df2.head()
Top 5 rows of data frame after data preparation
在上表中,我们可以看到第一排的乘客是一名男性,他从一个未知的始发港上船。因此,S 和男性列被设置为 1,C/Q/女性被设置为 0。
K-最近邻
我们将回顾的第一个算法是 K-最近邻算法。你可以在维基百科中找到更多关于该算法的信息。
在下面的代码中,我实例化了算法,并使用 StandardScaler 将数据转换为使用相同范围的值。接下来确定如何在不同的训练数据集之间拆分数据,随后使用 cross_val_score 函数调用算法,并在拆分的数据集中找到算法的准确性。
*# instantiating a K Nearest Neighbor model*
**from** **sklearn.neighbors** **import** KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors = 5)*# import classes and functions from the library to be used in cross validation*
**from** **sklearn.preprocessing** **import** StandardScaler
**from** **sklearn.pipeline** **import** Pipeline
**from** **sklearn.model_selection** **import** StratifiedKFold, cross_val_scoress = StandardScaler() *# packages scaler and model together*
pipeline = Pipeline([('transformer', ss), ('estimator', clf)])*# how we want to split up the data*
skf = StratifiedKFold(n_splits=5,random_state=42)*# using cross_val_score to train 80% of data and test remaining 20%. Generate 5 scores as it tests 5 different times*
scores = cross_val_score(pipeline, X, y, cv = skf)scores
输出:数组([0.79888268,0.78212291,0.82022472,0.84269663,0.83050847])
cross_val_score 函数将我们之前从文件中加载的初始数据集分成 5 个子集,并对每个子集运行 KNN 算法。然后计算算法的精度。换句话说,它检查算法是否成功地计算出了实际发生的结果。阵列显示,对于每个子集,该算法的准确率为 79–84%。
何时使用 KNN:
- 数据被标记
- 数据是无噪声的
- 数据集很小,因为算法被认为是“懒惰的学习者”
随机森林
我们要讨论的下一个算法是随机森林。同样,你可以在维基百科中找到更多关于该算法的信息。
在 Python 中使用该算法非常简单。我们再次使用具有相同输入和预期输出的 cross_val_score 函数。
*# instantiating a K Random Forest model with the default arguments*
**from** **sklearn.ensemble** **import** RandomForestClassifier
clf_rf = RandomForestClassifier()**from** **sklearn.model_selection** **import** cross_val_score, StratifiedKFold *# how we want to split up the data*
skf_rf = StratifiedKFold(n_splits = 5, shuffle = **True**, random_state = 42)*# using cross_val_score to train 80% of data and test remaining 20%. Generate 5 scores as it tests 5 different times*
score_rf = cross_val_score(clf_rf, X, y, cv = skf_rf)score_rf
输出:数组([0.81005587,0.77094972,0.80898876,0.85393258,0.82485876])
如前所述,对于 KNN,cross_val_score 函数对随机森林的作用类似。它分割初始数据集,对每个子集运行算法,然后计算算法的准确性。阵列显示,对于每个子集,该算法的准确率为 77–85%。
何时使用随机福里斯特:
- 大型数据集
- 不要过度拟合
- 数据集包含缺失数据,因为算法可以自动估计它们。可以使用的其他度量是切比雪夫、余弦等。
外卖:
在我的 KNN 模型中,一个值得注意的观察是 StandardScaler 的加入,这是包含不同规模变量的数据集中的一个必要步骤。在《泰坦尼克号》中,值为 5 到 50 的年龄列与 3 美元到 125 美元的票价列相比具有不同的比例。StandardScaler 执行标准化的任务。我发现这种利用极大地提高了我 KNN 模型的准确性,从基线的 62%提高到平均 81%。
具有最小训练阶段的 KNN 对于像泰坦尼克号这样的较小数据集是理想的,因为 KNN 在测试阶段保留所有的训练数据。在超过 100k 行的大型数据集中,随机森林可能更理想。与 KNN 相比,随机森林模型建立标签/分类所需的初始训练时间更长。然而,应用程序要快得多,因为事实模型是在新对象通过时创建的。
海难导致如此多生命损失的原因之一是没有足够的救生艇容纳乘客和船员。虽然幸存有一些运气成分,但是一些群体比其他群体更有可能幸存。女性性别和存活率之间有很强的相关性。尽管男性乘客比女性乘客多 84%,但女性幸存者比男性多。
当面对种类繁多的机器学习算法时,初学者提出的一个典型问题是“我应该使用哪种算法?”这个问题的答案取决于许多因素,包括:(1)数据的大小、质量和性质;(2)可用的计算时间;(3)任务的紧迫性;以及(4)你想用这些数据做什么。
这个有用的 scikit-learn 流程图为您提供了一个映射指南,帮助您根据数据大小、数据类型、预期结果和数据结构来确定最佳算法。
Credit: © 2007–2018, scikit-learn developers (BSD License)
参考文献:
二元分类。在维基百科中。检索于 2019 年 2 月 23 日,来自 https://en.wikipedia.org/wiki/Binary_classification
选择正确的评估者。在 Scitkit-Learn 中。检索于 2019 年 2 月 23 日,来自https://sci kit-learn . org/stable/tutorial/machine _ learning _ map/index . html
sci kit-learn:Python 中的机器学习,Pedregosa 等人,JMLR 12,第 2825–2830 页,2011 年。
抓住一个剑桥:监管法国的公开数据
由吉娜·阿克鲁特、萨曼莎·班西尔、马克西米利安·德·弗雷兹、亚斯米恩·莫罗、阿加特·R和尼古拉·乌尔施勒格
六名政治学院的学生寻求利用法国公开的犯罪数据来获得更大的利益。
经过两天的激烈竞争,我们这些掌握数字和新技术科学专业的学生参加了一个数据马拉松,旨在对来自法国公共服务的开放数据集的研究和计算进行实验。我们中的六个人决定研究公务员的费用问题。
寻找正确数据的挑战
我们的公共政策问题最初集中在法国公务员的成本上。为了成功回答我们的研究问题,我们试图在互联网上找到准确可靠的数据,然而,我们很快意识到许多数据集要么不可用、不完整,要么格式不正确。例如,我们在经合组织网站上找到的一个数据库提供了许多经合组织国家预算支出的详细数据,但没有法国的数据。似乎能提供我们正在寻找的信息的其他来源要么有过时的链接,要么由于缺乏正确的凭证而无法访问。
一份 Cour des Comptes 文件提供了图表,但是图表中使用的数据无法获取,因此无法核实。这揭示了透明度问题,并可能导致一些人质疑提供给已经过滤和“分析”的人的信息的真实性。通过向人们提供对简化信息的访问,理论上任何人都应该容易阅读和/或理解这条信息,但这阻止了那些想要实际挖掘迪普并出于学术原因或仅仅为了验证而使用“公开公共数据”的个人。
我们试图将话题转移到公务员养老金的成本上,希望我们能为这个更具体的话题找到高质量的数据。我们最终也面临着同样的问题。这些数据要么丢失了,要么已经被处理成让人们在无法接触到初始数据的情况下就能简单地阅读的形式。
甚至法国开放数据门户网站( data.gouv.fr )也提供了无法访问或无法使用的数据。例如,来自Caisse national de retraites des agents des collective s localés网站上的许多信息都是不可下载的。
改变话题
因此,我们被迫选择一个新的研究问题。有了对完整/干净数据集重要性的更好理解,我们试图解决另一个相关的公共政策问题:犯罪。我们选择犯罪作为一个问题,是因为它对公众福利的深远影响,也因为对这些数据的地理分析似乎是相关的。**我们的目标是分析入室盗窃背后的相关数据和模式,**以及更好地了解各部门之间的差异,以确定关键因素,如:警力密度、住房类型和社区财富水平。这一次,我们意识到这样一个事实,即我们的研究问题很可能必须根据我们所能找到的可用数据稍作调整。
为了创建一个完整的概览并探索整个国家的模式,我们分析了警方报告的数据,这些数据描述了自 1996 年以来每个月各省 107 起不同犯罪的警方档案数量。这些数据是最新的、完整的、可访问的,并且还提供了关于数据收集方式的描述,这对于找出可能影响数据集数量的偏差很有意思。
尽管警方报告提供的数据完整且质量良好,但我们知道其潜在的局限性。首先,并非所有罪行都被宣布,因此没有被纳入数据库。第二,日期是指它们被报告的时间,而不是它们发生的时间。最后,犯罪登记流程在过去几年发生了变化,即随着 2015 年 4 月 LRPPN 的实施,这意味着犯罪数量的部分变化实际上可能是由于登记流程的变化。我们试图绕过这些限制,把重点放在一类犯罪上,这类犯罪不应该被警方数据低估实际犯罪数量的问题过于关注。
考虑到大多数保险公司要求入室盗窃的受害者向警方提交报告才能获得赔偿,我们决定把重点放在入室盗窃上。网上公布的数字和统计数据以及法国内政部提供的数据证实,窃贼仍然以个人住宅为目标实施入室盗窃。回到法国大都市的规模,盗窃率相当于平均每天 667 起记录在案的盗窃案。换句话说,每两分钟就发生一起盗窃案。
我们决定专注于这一类别(更具体地说是针对主要住宅的盗窃)的原因之一是,事实上,如今追踪人们的活动越来越容易,例如,他们住在哪里,他们的习惯以及他们可能何时去度假。此外,为了不受犯罪登记流程演变的影响,我们选择将重点放在数据库中最近的两年,即 2017 年和 2018 年。
数据分析工作流程
Source: Joel Gombin via Github
从完整的警察犯罪数据集中,我们根据各个部门的盗窃总数对数据进行了过滤。我们将这些数据与 INSEE 提供的每个部门的人口数据进行了合并。因为入室盗窃与人口有关,我们进一步计算了入室盗窃与人口的比率,作为更准确的比较基础。然后,我们将这些数据集与这些部门的平均房产价值相结合,以每平方米的平均价格来衡量。由于我们在 data.gouv.fr 和 INSEE 的网站上都找不到关于房价的数据集,我们不得不手动创建它们,对法兰西岛地区使用来自 http://paris.notaires.fr 的估计,对其余省份使用来自https://www.efficity.com的估计。
最后,为了可视化数据,我们使用了 Science Po ’ s Atelier de Cartographie 开发的 Khartis 地图 app 。在可视化数据后,我们使用多元线性回归来模拟财产价值和盗窃之间的关系,同时检查人口。
结果:
法国
法国 2018 年的入室盗窃/人口比例与房价的相关系数相对较高(0.5)。回归结果证实了房价与入室盗窃之间的正相关关系,在 99%的显著性水平上显著。即使在控制人口规模的情况下,房价变量仍然与入室盗窃数量呈正相关,并且仍然具有统计显著性(也处于 99%的水平)。我们还检查了多重共线性和异方差,没有发现多重共线性的证据,但有轻微的异方差。当校正异方差时,我们发现我们的结果仍然具有统计学意义。
法兰西岛大区(2017)
法兰西岛地区(2018)
我们对法兰西岛地区进行了回归分析,但没有足够的观察数据来证明相关性检验结果的显著性。因此,我们不能对法兰西岛地区的入室盗窃和房产价值之间的潜在联系做出任何结论。
我们的解决方案:电子警察
虽然法国国家相对来说是开放数据最好的供应商之一,但我们在网上找到的数据并没有给我们提供现成的数据。从为正确的研究问题获取适当的数据,到处理数据以供进一步使用,这一具有挑战性的过程对公共政策的制定和随后的实施具有重要意义。在我们的设计实验中,我们努力应用通过计算数据集收集的知识。
首先,为了形成一套多样化和创新的政策解决方案来解决我们的问题,我们试图通过集思广益来促进思想的自由流动。我们站在利益相关者的角度,更好地理解各方的观点,并以全面的方式处理问题。这一重要步骤提高了我们对数据处理复杂性的认识,从房主打电话到警察局报案开始创建数据,到警官为同事或上级写报告处理数据。然后,通过写下我们的想法,相互交流,并阐述彼此的想法,我们能够就我们的最佳选择达成一致:一个允许公民跟踪盗窃案件并在数据归档过程中成为更积极参与者的平台。
该数据库可在线访问,也可通过手机访问,具有简单的用户友好界面,允许利益攸关方通过多种途径访问,并与当局和保险公司建立沟通渠道。利用从不完整和/或难以使用的数据中吸取的经验教训,这一解决方案提高了收集数据的简单性和质量,以及透明度,有可能更有效地利用公共警察资源。
结论
总之,我们在访问数据集的复杂性方面的经验使我们更加意识到这些不可访问的数据对于公民和公共利益攸关方所代表的潜在损失。在我们的旅程中,我们仍然能够使用完整的数据库,这使我们能够根据部门研究盗窃的发生率,我们研究了与住房价格的关系。使用**设计思维模型,**我们为法国政府概述了可能的政策解决方案,以改善数据收集,作为一个简单且受监控的盗窃报告流程。最终,所收集数据的质量可以提高对入室盗窃模式的认识,帮助警方解决这些问题。
跳舞还是不跳舞?—机器学习方法。
我爱跳舞!好了,我说了。尽管我可能不想一直跳舞,但我发现自己经常滚动播放列表,寻找最适合跳舞的歌曲。事情是这样的,它与流派无关——至少对我来说是这样。但这一切都与音乐有关。
这一切是如何开始的
我有一个问题:**我能根据歌曲的属性预测我是否能随着歌曲跳舞吗?**所以,我开始寻找一些答案——但在我与你分享我的旅程之前,让我们讨论一些将在整个项目中出现的关键概念。
可舞性 根据歌曲的音频特征,如节奏、拍子、效价 等,描述歌曲适合舞蹈的程度。我选择 danceability 是因为它是一首歌的音频特征的直接产物,因此是这些特征的准确表达——因为我喜欢跳舞,我认为这将是创建播放列表和提供推荐的一个很好的选择。
许多歌曲已经有了与之相关的可跳性指数,我们将使用这些数据来预测之前没有被分类的歌曲的可跳性水平。
音频特征是用于表征音频信号 的 特征。在这种情况下,这些特征是调、调式、拍号、声音、能量、乐器感、活跃度、响度、语速、效价和速度。
于是旅程开始了…
进入机器学习
来自机器学习大师的 Jason Brownlee 所讨论的预测建模,指的是 从输入变量(X)到输出变量(y)逼近一个映射函数(f)的数学问题。这就是所谓的函数逼近问题 。换句话说,我们正在使用历史数据对新数据进行预测。
一般来说,我们可以将大多数函数逼近问题分为两大类:回归和分类。由于我想练习分类算法,所以我决定将其设置为分类问题。
分类到底是什么?
斯蒂芬·马斯兰德(Stephen Marsland)在他的书《机器学习,算法视角,中定义的分类问题包括 获取输入向量,并根据每个类别的样本训练来决定它们属于 N 个类别中的哪一个。
分类问题是离散的,这意味着每个输入向量属于一个类别,类别集覆盖整个输出空间。
有几种方法可以解决分类问题,每种方法的解决方法可能不同,但本质上都是试图找到将一个类与另一个类分开的决策边界。
数据
这个项目中使用的数据集是使用 Spotify 的 API 构建的。它由 266,000 个观察值(歌曲)和以下预测属性组成:
- 轨道名称
- 艺术家姓名
- 相册名称
- 歌曲所属的播放列表
- 发布日期
- 流行
- 持续时间(分钟)
- 声学
- 拍子
- 方式
- 钥匙
- 效价
- 工具性
- 语音
- 活性
- 活力
- 音量
- 时间签名
目标变量 danceability 是一个介于 0.0 和 1.0 之间的浮动值,为了对歌曲进行分类,该变量被离散化并分成三个类别,从而使这成为一个多类分类问题。
- 此处禁止跳舞(0.0–0.49)
- 稍微摆动一下(0.5-0.69)
- 像没有人观看一样跳舞(0.70-1.0)
探索性数据分析
永远不要低估 EDA 的重要性。您需要非常熟悉您的数据以理解它,为建模准备您的数据,为您的问题提供更好的背景,阐明您可能有的一些初始假设,并更好地解释您的模型的结果。另外,EDA 很有趣!在处理分类问题时,我至少会建议:
- 绘制观察值的分布图,以检查类别不平衡。
Code for count plot to check for class imbalance.
2.使用箱线图检测预测要素中的异常值和异常值。
Code to create boxplots.
3.相关矩阵,用于研究不同变量之间的关系,并检查数据的多重共线性。
Code to create a correlation matrix.
4.检查连续变量的分布。
Code to generate histograms.
5.使用堆积图检查每个离散要素类别中的观察分布。
Code to create stacked plots.
考虑因素,然后是模型
正如我前面提到的,有一些分类模型可以尝试。我在这个项目中使用了 8 种不同的模型,但是今天我们将讨论其中的三种:k-最近邻(KNN) 、决策树和随机森林;我将使用 Scikit-Learn 库来实现它们。
在您进行任何建模之前,您应该使用您新发现的数据知识,现在您已经完成了彻底的 EDA,来查看您的功能并做出关于功能工程和功能转换的决策。我不会谈论我做了什么,因为这一步没有一个公式。但这是非常重要的一步。如果你想了解更多这方面的知识,我强烈推荐:Sinan Ozdemir 的《简单的特性工程》。
在这一点上,你也应该开始考虑如何评估你的机器学习模型的结果。当然,我还有另外一本书也很喜欢:Alice Zheng 的《机器学习模型评估》。有不同的评估标准,在不同的环境中,为不同的问题服务于不同的目的。谈到这些,人们也有他们的偏好和观点。因此,你的选择最终将取决于所有这些因素的组合,以及你试图回答的问题。
对于这个特定的项目,我决定测量 F1 的微观平均分数,并使用混淆矩阵。F1 分数是精确度和召回率之间的加权平均值。在评估多类问题时,这是一个非常常见的指标。混淆矩阵显示了每个类别的正确和错误分类的详细分类,这很重要,因为每个类别的错误分类可能会产生不同的成本。
k-最近邻(KNN)
假设你要去看歌剧,但你以前从未去过。你出现在歌剧院,却不知道该做什么。所以你选一个和你最亲近的人,观察,模仿。然后你去找 5 到 10 个和你最亲近的人,观察并模仿。这是 KNN 背后的总体想法。
Image from KNN Classification using Scikit-Learn by Datacamp.
KNN 存储整个数据集,并通过搜索 k 个最近的实例,并汇总这些实例的输出变量来预测新的数据点。为了确定实例之间的相似性,它计算距离的度量。这种度量可以是欧几里德距离、汉明距离、曼哈顿距离、闵可夫斯基距离、谷本距离、雅克卡距离、马哈拉诺比斯距离或余弦距离,仅举几个例子。
距离度量也是一种个人选择,取决于您的具体问题和数据;T2 k T3 号也是如此。通常,您会想要一起试验不同的数据度量和 k 的值,以查看哪种组合会产生最准确的模型。您可以在这里 查看使用 KNN 时可以调整的超参数列表。
在我的例子中,我决定使用 Scikit-Learn 中的穷举网格搜索方法来搜索超参数空间,以获得最佳的交叉验证分数。
KNN Classification: Model, Grid Search, Confusion Matrix and Classification Report.
Classification Report for KNN
这是一个很好的 F1 微观平均分数,但有一个关于 KNN 的小细节我之前没有提到:它是 计算昂贵的 ,并且它遭受 维度诅咒 。
决策图表
决策树在机器学习中相当受欢迎,因为制作一棵树的计算成本很低,使用它的成本更低。
Image from Decision Tree Classification with Python by Datacamp
借助决策树,我们将分类问题分解为一组决策,从根(基)开始,向下处理到*叶。*决策树不被视为黑盒型算法,因为它们共享内部决策逻辑。算法在给定节点上做出决策所依据的分割规则是您可以调整以优化决策树的超参数之一。其他流行的还有分裂策略和树的最大深度。
与 KNN 一样,在使用决策树时,有许多超参数可供选择,所以我再次使用穷举网格搜索来找到交叉验证分数最好的那些。
Decision Tree: Model, Grid Search, Tree Visualization, Confusion Matrix, and Feature Importance.
Classification Report for Decision Tree.
决策树的表现不如 KNN。如你所见,F1 的微观平均分数相当低。
随机森林
如果一个决策树是好的,那么许多树(因此,森林)一定更好,只要它们之间有足够的多样性。这是一个随机森林背后的基本思想,一个 集成学习 方法,在每个决策节点使用打包和约束特征选择的概念将随机性引入数据集。
Image by Victor F. Rodriguez-Galiano.
装袋,或 自举聚合 。bootstrap 样本是用替换样本进行的样本,所以我们最终会不止一次地选取一些观察值,而另一些则完全不选取。为什么?因为这样我们会得到很多表现稍有不同的弱学习者,这正是集成学习背后的想法。如前所述,随机森林也不同于常规决策树,它将学习算法限制在随机的特征样本上,以搜索每一棵单独的树;这样,每个子树都略有不同。在每个分割点可以搜索的特征数量是您可以使用的超参数之一。
Random Forest: Model, Grid Search, Confusion Matrix and Classification Report.
Classification Report for Random Forest.
这里要注意的一件重要事情是,即使 KNN 的 F1 微平均分高于随机森林,它也需要两倍以上的时间和内存来运行。正如我之前提到的,KNN 的计算成本很高。
那么,我们跳舞好吗?
有人说流派已死,有人不以为然。事实是,用户消费音乐的方式在过去 10 年里发生了巨大的变化。
播放列表创建习惯对音频流媒体公司进行更好的音乐推荐非常有帮助。正是因为播放列表为用户提供了灵活性,我们才开始发现使用流派作为推荐的主要特征还有哪些其他选择。
其中一个选项是可跳舞性。正如我们从我们一起经历的三个模型中看到的,我们可以准确地预测一首歌曲属于哪一个可跳舞类别。这意味着我们现在可以使用这个模型来分类那些没有舞蹈指数的歌曲,仅仅使用它们的属性。
在大多数情况下,你会尝试许多不同的车型来寻找最好的——我说的最好,并不是指 F1 微观平均分数最高的车型。你会想要一个在你选择的任何度量上都有良好性能的模型,是的,但是你也会想要警惕计算的复杂性,以及你的项目的特定需求。
算还是不算?粗心的估算可能导致错误结论的实际例子
有了估算缺失数据的强大力量,就有了了解自己在做什么的巨大责任。
Photo by Jean-Philippe Delberghe on Unsplash
背景
近年来,我有幸与许多在该领域起步的数据专业人士进行了交流,并看到他们中的许多人都经历了类似的顿悟:
你在课程中学到的东西并没有为你在现实世界中可能遇到的各种场景做好充分的准备!
公平地说,有太多的角落案例,没有哪门课程能够全面涵盖。因此,作为一名数据专业人员,我们每个人都应该把自己发展到能够解决我们从未见过的问题的程度。这篇文章讲的就是这样一个例子,这个例子在课程中没怎么教过,但它可能意味着一个“普通”的数据专家和一个“超出预期”的数据专家之间的区别。
每当建模任务中出现缺失数据时,一种常用的技术是估算缺失数据,这是我们的建模代码工作所必需的。然而,在有大量缺失数据的情况下,如大批量生产测量,插补后的结果模型表面上看起来可能很弱。但是只要再深入一点,就可以发现这个模型相当强大,估算值扰乱了度量计算。这篇文章就是一个这样的例子,用一个典型的非常稀疏的数据集来展示这个场景,这个数据集就是统计过程控制测量数据。这篇文章的所有代码都在这里:链接
统计过程控制
在现代大规模制造(HVM)工厂中,统计过程控制(SPC)系统对于确保所有制造设备交付符合客户规格的产品至关重要。例如,在自动化汽车装配厂,客户规格可能是平均汽车发动机应提供 22.5 英里每加仑(mpg)的燃料,并且是“响应”变量。
然而,自然界中没有一个过程会 100%的时间都在目标上。相反,正常的变化会导致一些发动机的输出功率高于 22.5 英里/加仑,一些发动机的输出功率低于 22.5 英里/加仑。假设客户理解这一点,可以容忍+/-1.5 英里/加仑的偏差。任何超出这些公差限制的发动机都不能出售给客户,需要报废或作为备件出售,从而给公司造成收入损失。因此,我们的响应变量的目标为 22.5 英里/加仑,控制上限(UCL)为 24 英里/加仑,控制下限(LCL)为 21 英里/加仑。
正如预期的那样,公司的高级管理层希望生产的发动机 100%符合这些规格(规范)。然而,在自然界中,除了死亡和税收,没有什么是 100%确定的。相反,作为工程师和统计学家,我们退而求其次:我们可以使用 SPC 系统和 6-sigma 流程来确保 99.73%的发动机符合规格。
延迟响应的困境
典型的 HVM 生产线从纯原材料到销售给客户的完整成品可能需要一周到几个月的时间。由于“响应”变量是客户规格,因此它们只能在产品已经制造完成并准备交付给客户时,在制造产品线的末端进行测试
这里的问题是,如果生产线早期的一台设备出现故障并生产出有缺陷的零件,只有在几周或几个月后我们测试这些产品的“反应”时才能发现因此,大量产品可能在流氓设备中加工,并在被检测到之前对公司的收入造成重大影响。所以很明显,这个策略是超级冒险的。
为了防止劣质设备造成巨大的收入损失,HVM 工厂在生产线的各个阶段持续测量产品的临界尺寸(CD)。然后,SPC 系统使用这些 CD 来跟踪测量值是否在 6-sigma 流程之后的可接受公差范围内运行。
最后,这个帖子的问题陈述
现在考虑下面的问题陈述:所有的 CDs 都在其指定的 6-sigma 容差范围内执行,但是响应变量有很大一部分落在客户规格之外。我们需要收紧一些 CD 中的变化,以加强响应。因此,有两个问题需要回答:
- 考虑对产品测量的所有 CDs,哪一个对响应的变化影响最大,它们的贡献是什么?
- 这些相关 CD 的变化应该收紧到什么程度,以确保响应符合客户规格?
让我们尝试使用数据分析来回答这两个问题。第一个问题将在这篇文章中回答,而第二个问题是我下一篇文章的主题:在这里保持警惕!
免责声明:本研究中使用的所有数据完全是综合生成的,以证明标准回归技术。
方法
让我们更详细地考虑第一个问题,并看看我们可以得到的数据。如下面的代码片段所示,我们的数据由 200 个特性列、一个响应列和 30K 行组成。
Dataset rows = 30000, columns = 201
df.head() shows a large number of NaN values
在我们对这些数据进行任何分析之前,让我们首先将数据帧分成训练集和测试集,这样,从训练集泄漏到测试集的信息的可能性最小。我们将“train”拆分为前 80% (24K)的行,将“test”拆分为后 20% (6K)的行,以模拟使用过去的数据进行培训,使用未来的数据进行测试。所有后续研究应在“训练”组上进行,并最终仅使用“测试”组来确认我们的模型在未知数据上的性能
X_train, y_train, X_test, y_test shapes = (24000, 200), (24000,), (6000, 200), (6000,)
反应研究:
response variable distribution
让我们先来看看我们的响应变量的分布,看看是否有什么问题首先值得解决。该响应符合良好的正态分布,约 10%的响应在规格范围之外。因此,我们生产的产品几乎有 10%都卖不出去。真是浪费!我们现在可以理解为什么高级管理层不高兴,并内化为我们需要做些什么来改善这种情况。
特征工程:
接下来,让我们更仔细地看看特性。我们的第一个观察结果是,有大量的“NaN”值表示数据集中缺少数据。我们与我们的领域工程师交谈,以了解为什么会这样。原因很简单。在制造工厂中,任何额外的测量都会占用有限的时间,而不会给产品增加任何价值。因此,生产工程师希望尽可能减少测量的产品数量。对于这种产品,数据告诉我们,平均来说,大约 80%的产品没有在每个特性上得到测量。
Mean missing = 81.39%; Min missing = 65.23% ; Max missing = 81.98%
不过没关系,我们对机器学习了如指掌,可以用插补让那些缺失的值神奇地重新出现,对吧?也许吧。也许不是。坚持这个想法,直到我们在这篇文章的后面讨论结果。让我们从使用来自sklearn
的SimpleImputer
类输入每一列的“平均值”开始。
# Impute missing values
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
我们的下一个观察是,每个特征似乎在一个非常不同的尺度上。为了对哪些特征对响应影响最大进行排序,我们需要将它们标准化到相同的尺度。标准化确保了在我们的分析过程中它们都被平等对待。我们将使用sklearn
中的StandardScaler
类来实现这一点。
X_train.describe()
# Scaling
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
建模:
向我们提出的问题陈述是,我们不仅需要解释哪些特征对反应有影响,而且我们还需要提供每个特征有多大影响的估计。由于这种可解释性要求,我们决定抛弃黑盒模型,坚持使用易于被工程团队解释的线性模型。我们将使用sklearn
中的LinearRegression, LassoCV, RidgeCV and ElasticNetCV
回归估计器来构建和测试最流行的线性模型。
# Linear model
from sklearn.linear_model import LinearRegression, LassoCV, RidgeCV, ElasticNetCV
alphas = np.logspace(-6, -0.1, 100)
lr_model = LinearRegression()
lass_model = LassoCV(alphas=alphas, cv=3, max_iter=10000)
rid_model = RidgeCV(alphas=alphas, cv=3)
elas_model = ElasticNetCV(alphas=alphas, cv=3, max_iter=10000, l1_ratio=0.5)
管道:
最后,为了将特征工程和建模部分联系在一起,我们使用了来自sklearn
的Pipeline
类。
model_pipeline = Pipeline([
('imputer', imputer),
('scaling', scaler),
(model, estimator)
])
结果
Summary of results for different linear models
对于每个估计量,我们在 10 次交叉验证(CV)分割中平均均方根误差(RMSE)和 R 平方(R2 ),以评估它们的性能。由于Lasso, Ridge and ElasticNet
嵌入了alpha
超参数搜索,我们还打印出每个估计量的最佳alpha
。所有模型的结果都不好。均方根误差仅比响应的标准差低 0.1 左右。
现在,很容易在这一点上停下来,告诉高级管理层数据太稀疏(80%缺失)并完全放弃这个案例。但是,一个真正的数据科学家是不会这么快放弃的!我们决定进一步挖掘这些结果,看看是否还能提取一些有用的东西。毕竟,有志者事竟成!
实际与预测图
我最喜欢的可视化任何回归模型性能的方法之一是绘制实际与预测图。在这种情况下,我们立即看到有两个相关性。一些数据点落在“显著相关”线上,而许多其他数据点落在“弱相关”线上。如果我们能够消除那些落在弱相关线上的数据点,我们的性能指标应该会有很大的提高。
但是是什么导致了这种情况呢?嗯,一个很大的线索是所有这些数据点的预测值。是~22.5,也是我们实际反应数据的“均值”。如果你还记得,在这篇文章的特征工程部分,我们用每一列的“平均值”来估算所有缺失的数据。由于该数据非常稀疏,那些具有跨所有特征估算的“平均”数据的数据点将预测也接近“平均”的响应!
重要特征
Coefficients of the Lasso model: coef[coef[‘standardized_coefficient’] != 0]
在这一点上,我们可以删除所有等于“平均值”的预测,这将大大改善我们的预测。然而,为了获得最好的预测能力,我们首先研究影响反应的主要特征。由于我们将所有特征标准化为相同的尺度,因此我们可以简单地将所有特征的标准化线性系数的绝对值按降序排列。或者在 Lasso 回归的情况下,打印所有非零标准化系数。在数据集中的 200 个要素中,有五个要素与 Lasso 模型的响应变量最相关。有了这些信息,我们现在可以只删除 Lasso 模型用来防止插补噪声的这五个特征中包含插补值的行。
在测试集上检查性能
最后,我们在测试集上通过计算 RMSE、R2 和绘制实际与预测图来测试模型。回想一下,我们已经删除了在与回答相关的五个特征中的任何一个特征中具有估算数据的行。如您所见,一旦在预测过程中移除估算值,该模型就具有非常强的预测能力!这表明,在进行预测时,我们必须限制自己只预测那些包含所有 5 个重要特性的数据的行。
Actual vs Predicted plot on Test dataset after removing rows that have imputed data in any of the 5 important features
有了这种认识,我们就可以影响负责选择测量采样方式的工程团队。例如,由于每个特征是在 20%的行上测量的,工程团队可以实施一种抽样策略,以确保这些测量值的一半(10%)是在所有 5 个特征上测量的,而另一半(10%)保持随机。了解您的客户并利用数据影响他们的决策是任何数据专业人员的重要技能!
结论
在本帖中,我们看到了一个估算可能导致错误结论的实际例子,我们试图回答这个问题:考虑对产品测量的所有 CDs,哪个对响应的变化影响最大,它们的贡献是什么。然而,更深入的挖掘可以揭示一个有用的模型和额外的见解,可以用来影响客户行为。在我的下一篇文章中,我们将看到如何使用这个模型来回答第二个问题:相关 CDs 的变化应该收紧多少,以确保响应符合客户规格。这篇文章的所有代码都可以在这里找到:链接
让人工智能发挥作用——让计算机像计算机一样思考
人工智能研究人员渴望复制人类思维。但我们已经看到,人工智能的真正关键是让机器以自己的方式超越他人。
由(www.percepto.co)Percepto的首席技术官 Sagi Blonder 提供
人工智能(AI)这个词在今天的科技(和日常生活)世界中是不可避免的。高端、最先进的人工智能应用确实正在改变企业分析数据的方式,或者工业产品的设计和生产方式。
也就是说,什么是人工智能,什么不是人工智能可能会令人困惑。对人工智能应该如何工作的根本误解可能会阻碍真正自主机器的进展。原因?我们需要学会区分人工智能和人工智能,前者依靠人类来准确定义机器应该如何学习,后者由人类向机器提出问题,然后让机器根据自己的经验和能力来解决这个问题。
例如,让谷歌助手开玩笑或帮助 Spotify 和网飞学习你喜欢和不喜欢什么的人工智能就是前者的一个例子。这是机器学习,人工智能的一个分支,但本质上是一种超级聪明的方法,让机器编程来执行任务。
人类驱动的人工智能的另一个例子是神经网络——其操作模仿人脑。这些技术正被用来创造惊人的专家机器,这些机器被训练来完成一项单一的任务,并且成功的水平不断提高。例如,最近的一项研究显示,一种基于神经网络的算法在脑部 CT 图像中对颅内出血进行分类的成功率相当于一名四年的放射科住院医师。这些解决方案非常可靠,FDA 已经批准使用图像分析算法来帮助诊断,甚至自动确定病人护理的优先顺序。
然而,这些机器仍然按照我们教它们的方式做我们教它们做的事情。
这就是问题的要点。因为把一个能产生艺术的机器和一个有创造力的机器,或者一个知道因果的机器和一个有常识的机器混为一谈是很危险的。只有当我们让机器像机器一样思考,而不是像制造它们的人一样思考,真正的机器自主才能实现。
这看起来怎么样?
举个最近的例子,想想谷歌子公司 DeepMind 开发的国际象棋算法 AlphaZero 。为了探索国际象棋本身的复杂性,AlphaZero 开发了罕见的棋步——以一种完全独特的风格下棋,并持续获胜。AlphaZero 的兄弟 AlphaGo 掌握了古老而复杂得可笑的围棋——采用了一种独创的策略和看不见的战术,让世界知名的大师们瞠目结舌(并一直被打败)。
在更实际的层面上,自动驾驶汽车的出现提出了有趣的人工智能挑战。考虑“驾驶员直觉”的问题。有经验的人类司机通常能够预测汽车何时要变道,即使在转向灯激活之前。我们人类能够利用我们的经验来直觉行为,这些行为可能在物理上并不明显。我们是如此无意识地这样做,以至于我们中的许多人无法用语言准确地表达我们是如何知道我们所知道的——我们只是知道而已。
这种直觉——可以说对安全驾驶和其他危险的现实世界任务至关重要——可以被分解并教给机器吗?可以用来历不明的信息注释一个图像吗?解决这个问题的一个常见方法是使用强化学习——通过改进自己的技术来训练机器达到某个目标,而不是通过从其他人那里学习样本。然而,通过强化的方式训练自动驾驶汽车也有其自身的挑战。一个是模拟质量的内在限制,因为我们无法真正让自动驾驶汽车在真实的道路上学习如何驾驶。给汽车的感官数据加上标签,描述道路上还没有发生的事情,又怎么样呢?我们如何标记无关的数据——例如,传感器看不到的汽车,隐藏在卡车后面或框架外的汽车。而没有这个出发点,机器又怎么能学会寻找汽车存在的暗示呢?
简单的答案是我们无法教会一台机器 直觉。我们可能永远也不会制造出像人类一样思考的机器,这也不是我们必须追求的目标。在实验室和现实世界中已经证明了自己的是,让机器以它能理解的方式理解给定的任务——让机器利用它们的优势来补偿不是人类。
例如,一项新的研究表明,一台经过训练的细胞分类机器学会了在不添加荧光标签的情况下做到这一点,荧光标签用于使细胞特征对人眼来说显而易见。通过在添加侵入材料之前拍摄细胞图像,并用后验知识进行标记,机器找到了一种检测人类无法检测到的东西的方法。澄清一下,没人教机器怎么做这个。它看着数据和自己的能力,无视建造它的人类的限制,独自解决问题。
底线
当我们放下我们狭隘的学习和理解概念,接受不同的有机体有不同的运作方式时,真正的自主机器就能实现。鉴于今天的技术限制(仍然有很多),当我们放弃生产像人一样思考的机器的目标,让机器成为机器时,我们将在机器自主方面取得更有效的结果。
识别野外家庭(RFIW):大数据挑战
野外家庭的视觉识别
前方的路(第一部或多部)
Training machinery to identify relatives using visual cues like imagery, videos, and such.
相关链接
- 2020 识别野外家庭 (RFIW) w 工作坊网页
- RFIW-2019 、 RFIW-2018 、 RFIW-2017 挑战赛网站
- 野生家庭项目页面
- 亲属关系验证:Python 熊猫教程(第二部分)
概述
我的博士研究涉及亲属识别和 FIW 数据集。在不久的将来,我们的目标是总结关键发现,同时在每年举行的顶级会议上提供数据挑战的经验教训和演示(即,这是未来的第一次)。概观
我的博士研究涉及亲属识别和 FIW 数据集。在不久的将来,我们的目标是总结关键发现,同时在每年举行的顶级会议上提供数据挑战的经验教训和演示(即,这是未来的第一次)。
要了解更多关于 FIW 的信息,请访问项目页面。要了解更多信息、注册并参与即将到来的 RFIW 2020,请访问研讨会页面。
通过图像自动识别血亲(即亲属关系)的能力在大量应用中具有前景。仅举几个例子:法医(例如,人类追踪、失踪儿童、犯罪现场调查)、边境控制和安全、流离失所的难民家庭、历史和家谱血统研究、社交媒体、预测建模,以及减少面部识别的搜索空间。
在微笑实验室,我们是这个问题的最初开拓者之一【7-10】。2011 年,我们为基于亲属的视觉任务铺平了道路,这是一个最初的公共数据集, UB KinFace 数据库。尽管如此,几年后,我们用第一个用于亲属识别的大规模图像数据库,即野生家庭 (FIW)数据库[4,6],推动了“深度学习”的热潮。FIW 为 1,000 个家庭提供图像,平均每个家庭有 5.6 个成员和 13.7 张家庭照片;每个家庭都有完整的标签,包括所有成员的姓名、性别和关系——FIW 从这些丰富的标签信息中服务于多任务目的[2]。
我们发起了第一次大规模的亲属识别数据挑战,识别野外家庭 (RFIW) [4]。我们在 2017 年(即 RFIW’17 )开始举办数据挑战研讨会,与 ACM 多媒体的会议同时举行。在第一次 RFIW 成功后,101 个团队在两个任务之间注册(即亲属关系验证和家庭分类),七篇论文在2017 RFIW 会议录中被接受并在研讨会上发表。为此,我们也很荣幸地邀请到了这样一位杰出的主题演讲人:DHS 的 Chris Myles 和 Salesforce 的研究员 Xiong。
自此,RFIW 转型为一个系列赛,在 2018 和 2019 举办的挑战赛为 IEEE FG 挑战赛【3】。在我们的开源报告中,公众可以获得作为基准记录并作为最先进技术发布的协议、实验和模型。要深入了解 FIW 数据,请参见我们的 PAMI [2]。
几个出版物被引用了 500 次,两个数据集,研讨会,挑战和最近的 Kaggle 竞赛,我们预计这一势头只会从这里开始——研究人员被吸引到 RFIW,这已经形成了一个年度挑战。此外,FIW 作为一个整体,吸引了专家,新的博士,甚至其他领域的专业人士。此外,FIW 的数据在实际应用中有很多方法,比如给父母一对面孔,预测孩子的外貌[1]。
毫无疑问,这个问题现在需要从研究转向现实的资源关注。
文献学
[1]·高,·夏,约瑟夫·P·鲁宾逊,·张,,,和云复.“你的孩子会是什么样子?DNA-Net:年龄和性别意识的亲属脸合成器 arXiv 预印本 arXiv:1911.07014 (2019)。[ 纸张
[2]约瑟夫·罗宾逊、邵明、刘洪福、吴越、蒂莫西·吉利斯和傅云。《野外家庭的视觉亲属识别》IEEE TPAMI 特别版:计算脸(2018)。[ 论文
[3],,丁,,约瑟夫·P·鲁宾逊,和傅云。通过潜在自适应子空间进行亲属分类,,在第十三届 IEEE 国际会议上,自动人脸&手势识别(FG 2018)。IEEE。论文
[4]约瑟夫·P·罗宾逊,,,,赵,,蒂莫西·吉利斯,傅云.识别野外家庭(RFIW):结合 ACM MM 2017 举办的数据挑战研讨会,载于ACM 多媒体会议:2017 年识别野外家庭研讨会会议录,第 5-12 页。ACM。【论文、论文集、内容
[5]王淑洋、约瑟夫·罗宾逊和傅云。“利用边缘化去噪度量学习对野外家庭进行亲属关系验证”,第 12 届 IEEE 自动人脸和手势识别国际会议(FG 2017)。第 216–221 页。IEEE。[ 纸张
[6] Joseph Robinson,,,,和 Yun Fu,野外家庭(FIW):大规模亲属图像数据库和基准,,载于 2016 年 ACM 多媒体会议论文集(第 242-246 页)。ACM。
[7]夏,,罗杰波,傅云,在一张照片中了解亲属关系,载于 IEEE 多媒体汇刊(T-MM),第 14 卷,第 4 期,第 1046–1056 页。IEEE,2012 年。
[8]夏,,傅云,利用视觉属性进行亲属关系验证,载于模式识别(ICPR),2012 年第 21 届国际学术会议上(第 549–552 页)。IEEE。
[9]夏,,傅云,通过迁移学习进行亲属关系验证,人工智能国际联合会议论文集。第 22 卷。№3.2011.
[10],,夏,云复,基于 UB KinFace 数据库的系谱人脸识别,计算机视觉与模式识别研讨会(CVPRW),2011 年 IEEE 计算机学会会议上。IEEE,2011 年。
公差叠加
以及如何使用蒙特卡罗模拟来代替
什么是公差叠加?
想象你有两个圆盘,你想把它们紧紧地放在一个开口里。如果你只需要将这三个部分装配在一起一次,你可以测量一下这些圆盘有多高,然后按照这个尺寸裁剪,调整到完美为止。如果你试图将这三个部分组合在一起很多次,那么事情就变得不确定了。你的一些冰球可能比你的开放和不适合。你的一些冰球堆可能比开口小得多,你的零件会比你想要的更松。
你可以把你的黄色冰球设计成 30 毫米高,但是冰球的尺寸更可能在 29 到 31 毫米之间。在这种情况下,黄色圆盘的高度公差为 1 毫米。
你可以测量每一个部分,将较大的黄色圆盘和较小的红色圆盘配对,强迫所有东西都工作。(这个过程被称为宁滨)。这确实有效,但是测量零件需要时间。俗话说,时间=金钱。顺便说一句,时间也等于时间。所以如果你想减肥,你需要愿意花很多时间和金钱去减肥。
这就是公差叠加的用武之地。当您有想要放入开口中的零件时,公差叠加是一种工具,允许您确定您的零件是否总是放入开口中,即使您正在制造成千上万个这样的组件。
公差叠加是一种创建循环的方法,该循环包括“堆栈”中的每个关键尺寸它使您能够查看这些值的尺寸和公差,以确定您的设计是否会相应地工作和更新。它通常看起来像这样:
那么,为什么不使用容错堆栈呢?
在类似上面例子的情况下,公差叠加很容易组合在一起,它给了你创建一个好的设计所需要的所有信息。如果出现以下情况,公差叠加就不再那么有用:
- 在你的层叠中你有更多的维度
- 您看到的是圆形零件的公差及其径向配合。
- 你已经知道你的零件的分布情况
每一种情况都需要蒙特卡洛模拟。
FUN FACT: Monte Carlo simulations are named after the location because it is a gambling hot spot.
如何使用蒙特卡洛模拟来代替公差叠加?
在蒙特卡洛模拟中,您可以为包含在公差叠加中的每个尺寸生成真实值。一旦生成了这些值,就可以通过相同的循环来加减值,从而生成临界尺寸的分布(在我们的示例中,是从 4 到 1 的差距)。最后,你要设定一个预期的 yield⁴,看看你的产量的临界尺寸是多少。这可能会告诉你,你可以让你的设计差距变小,或者你需要让它变大。这种分布可能会告诉你,宁滨有很强的优势。
First three histograms show simulations based on the expected tolerances of the parts. Last histogram shows the expected resultant gaps. Green lines show ± 3 sigma from the mean.
请注意,零件遵循公差叠加中预期的零件规格。然而,最终的间隙分布得足够紧密,使得间隙上的公差比来自公差叠加的 RSS 值更紧密。
为了让事情更有趣,我们来看一个放射状的例子。
想象一下,你正在将一个塑料钉安装到一个金属开口中,如左图所示。这种联系汇率制度对 it⁵.有决定性的影响你想让顶部塑料部分和顶部金属部分之间的间隙在四周尽可能的小,而不要撞到它。
看起来很简单,对吧?可惜不是。如果一切都是完美的圆形,这将工作得很好。但是,如果您考虑下面画出的场景,您会发现公差叠加缺少一些信息。这些图像是对现实场景的夸大。
蒙特卡洛模拟允许您模拟每个零件偏离中心的径向角度和每个零件离圆角最远的径向角度。通过模拟您的结果,您可以考虑偏心特征同时导致零件配合的次数,以及它们同时导致零件干涉的次数。这通常会导致比公差叠加更紧密、更真实的合成公差。这是因为公差叠加迫使你假设问题维度都处于相同的径向角度,而实际上,它们几乎肯定不是。
我已经将用于生成此模拟的代码粘贴在下面:
# importing libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt%matplotlib inline # Generating part measurement data
df['purple_r'] = np.random.normal(15.05, .1, 1000)
df['purple_off_center'] = np.random.normal(0, .02, 1000)
df['angle_purple_off_center'] = np.random.uniform(0, 6.283185, 1000)
df['grey_off_center'] = np.random.normal(0, .02, 1000)
df['grey_r'] = np.random.normal(15.5, .03, 1000)
df['angle_grey_off_center'] = np.random.uniform(0, 6.283185, 1000) # Generating assembly measurement data
# Using df['angle_purple off center'] as direction of gap
df['Circularity Contribution Purple'] = df['purple_r']
df['Concentricity Contribution Purple'] = df['purple_off_center']df['Circularity Contribution Grey'] = df['grey_r']
df['Concentricity Contribution Purple'] = df['grey_off_center'] * \
np.cos(df['angle_purple_off_center']-df['angle_grey_off_center'])df['gap'] = np.abs(df['Circularity Contribution Purple']) + \
df['Concentricity Contribution Purple'] - np.abs(df['Circularity Contribution Grey']) \
- df['Concentricity Contribution Purple']# Part measurement data graphfig, ax = plt.subplots(2, ncols=3, figsize = (14, 8))
ax = ax.ravel()
ax[0].hist(df['purple_r'], bins =20, color='purple')
ax[0].set_title('Distribution of \n- Purple Large Radius')
ax[0].set_xlabel('mm')
ax[1].hist(df['purple_off_center'], bins =20, color='purple')
ax[1].set_title('Distribution of Concentricity\nof Features on Purple Part')
ax[1].set_xlabel('mm')
ax[2].hist(df['angle_purple_off_center'], bins =20, color='violet')
ax[2].set_title('Distribution of Angle of\n Off Center for Purple Part')
ax[2].set_xlabel('radians')
ax[3].hist(df['grey_off_center'], bins =20, color='dimgray')
ax[3].set_title('Distribution of Concentricity\nof Features on Grey Part')
ax[3].set_xlabel('mm')
ax[4].hist(df['angle_grey_off_center'], bins =20, color='lightgray')
ax[4].set_title('Distribution of Angle of\n Off Center for Gray Part')
ax[4].set_xlabel('radians')
ax[5].hist(df['grey_r'], bins =20, color='dimgray')
ax[5].set_title('Distribution of \n - Grey Large Radius')
ax[5].set_xlabel('mm')
plt.tight_layout(); # Assembly measurement data graph
fig, ax = plt.subplots(1, ncols=4, figsize = (14, 4))
ax = ax.ravel()
ax[0].hist(df['Circularity Contribution Purple'], bins =20, color='purple')
ax[0].set_title('Circularity Contribution Distribution \n Purple Outer Radius')
ax[1].hist(df['Concentricity Contribution Purple'], bins =20, color='violet')
ax[1].set_title('Concentricty Contribution Distribution \n Purple Radii Relative to Each Other')
ax[2].hist(df['Circularity Contribution Grey'], bins =20, color='dimgray')
ax[2].set_title('Circularity Contribution Distribution \n Grey Outer Radius')
ax[3].hist(df['Concentricity Contribution Purple'], bins =20, color='lightgray')
ax[3].set_title('Concentricty Contribution Distribution \n Purple Radii Relative to Each Other')
plt.tight_layout();# Final Gap Graph
mu = df['gap'].mean()
sigma = df['gap'].std()plt.hist(df['gap'], bins =20, color='black')
plt.title('Resultant Gap Distributions', fontsize = 16)
plt.axvline((mu-(3*sigma)), color='green', alpha=0.5)
plt.axvline((mu+(3*sigma)), color='green', alpha=0.5)
plt.axvline((mu+(3*sigma)), color='green', alpha=0.5)
plt.xlabel("Gap (mm)")
plt.ylabel("Assembly Count")
plt.tight_layout();
[1]公差通过多种方式确定。设计工程师将在零件图中规定每个关键尺寸的公差。该公差通常是基于该制造方法的零件公差的最佳实践以及来自制造零件的供应商的反馈而创建的。如果公差叠加表明它需要比最佳实践更严格,在许多情况下也可以这样做,但会增加零件的成本。
[2]我说的总是,是指几乎总是。离群值总是会发生。零件将超出规格。你甚至可能愿意在知道你会扔掉零件的情况下进行设计。对于这个博客来说,“总是”实际上意味着“你想要多少就有多少。”
[3]如果这是在数据可用之前完成的,那么你可以根据给定的制造过程和质量,根据你对这些数据的期望来生成值。如果您已经在制造零件,您可以使用每个工具的平均值和标准偏差来生成数据。
[4]如果你以前听说过“六个适马”这个词,并想知道它是什么意思,那么你从杰克·多纳吉那里听到的都不是真的。它指的是设定您的收益率,使 3 个标准差(六西格玛)符合规格(即您的收益率为 99.99966%)
[5]挤压肋是包含在较软零件中的小肋,当它被推入较硬零件时会被挤压。除非硬零件的圆度或小零件中的挤压肋有重大问题,否则这往往会创建一个足够接近挤压特征中心的配合,您可以假定配合的公差为零。
太多颠倒的照片?花 20 分钟,用 AI 来翻它们。
当你花了两个小时扫描照片,却突然发现你已经把一些随机的照片上下颠倒了,这真是太棒了。与其痛苦地浏览每一个并翻动它们,你可能会觉得你宁愿跳到一辆卡车前面。嗯,当一个客户带着类似的问题来找我们时,我立即想知道机器学习是否能够有所帮助。你猜怎么着?确实如此。结束了。
如果你有兴趣知道我是如何在 20 分钟内做到的,那么请继续阅读。
有时候,机器学习可能更多地是一门艺术而不是科学,即使它在技术上是一门科学。也许科学就是艺术?一个稍后讨论的无聊话题,更有趣的是我在这里提出它的原因。
每当我被问到“我们可以用机器学习来解决这个问题吗?”我的回答永远是“不知道— 我们试试看”。
实验对于成功使用机器学习至关重要。如果你花了 6 个月的时间为一个特定的用例建立一个模型,你可能会发现为时已晚,它并不真的工作得很好。相反,我喜欢寻找快速测试的方法,看看使用机器学习来解决问题是否有一些可行性。
所以,回到正面朝下的照片。这个特殊的用例是关于有时上下颠倒的人的照片。大多数面部识别工具在面部上下颠倒时都会有困难,所以我们至少需要在将其提交给面部识别功能之前将其翻转为正面朝上。
所以我想,让我们试着训练一个图像分类器,看看我们能否检测出一张照片是不是上下颠倒的。请注意,这是在研究了检查 EXIF 元数据以查看其中是否有关于旋转的信息的可能性之后;没有。
我做的第一件事是搜寻训练数据。我去谷歌图片搜索‘脸’。我下载了尽可能多的图片(大约 346 张),并创建了一组正面朝上的图片。然后,我尝试用谷歌图片搜索“颠倒的脸”——这是一个错误,原因有很多很多。最相关的原因是因为我想做的是训练分类器来检测两个可能相同的东西之间的差异,所以我选择翻转所有正面朝上的照片,这样我就有了一个颠倒的副本。我知道如何大规模实现这一点的唯一方法是使用苹果的 Automator。
设置您的工作流程,使“获取指定的 Finder 项目”指向“面孔”文件夹,链接到“获取文件夹内容”,链接到“拷贝 Finder 项目”并创建新文件夹,然后将“旋转图像”设置为 180 度。
我运行了这个工作流程,最终得到了相同数量的颠倒的面。然后,我去了我们的一个开源项目 imgclass ,下载了命令行工具,安装了分类框,开始了培训工作。
“该死”当我看着 imgclass 输出的结果精度时,我喊道。只有 34%。不够好。我需要更多的训练数据。所以我想,哪里可以找到更多的面孔?没错,野外贴标签的脸!
野生环境中的标签人脸拥有 13234 张独特的人脸图片。我很快下载了它,运行 bash 命令将所有照片从它们的嵌套目录中移除,并将其展平到一个文件夹中,然后在这个文件夹上再次运行 automator 工作流以创建颠倒的类,并在新的数据集上启动 imgclass。
在我的 Mac 电脑上用这么多照片训练 Classificationbox 花了大约 1 小时 45 分钟,所以从技术上讲,整个过程花了 20 多分钟,但我自己只花了大约 20 分钟。
一旦完成,我对 imgclass 报告的新的准确数字感到自豪。99.97%
果酱!
现在,我有了一个有效的模型来检测面部照片何时颠倒,我可以在工作流程中使用它来校正无数的图像。如果你真的对使用这个感兴趣,我会为你节省 20 分钟+~ 2 小时的处理时间,并在这里给你一个模型的链接。
将该状态文件加载到 Classificationbox 中,就可以开始检测颠倒的人脸了。
不客气。
过于强大的自然语言处理模型(GPT-2)
什么是生成性预训练
Photo by Edward Ma on Unsplash
OpenAI 发布了生成式预训练模型 (GPT),该模型在 2018 年的许多 NLP 任务中取得了最先进的结果。GPT 利用 transformer 来执行无监督学习和有监督学习,以学习 NLP 下游任务的文本表示。
为了展示这种模式的成功,OpenAI 对其进行了增强,并于 2019 年 2 月发布了一款 GPT-2。GPT-2 被训练为基于 40GB 文本预测下一个单词。与其他模型和实践不同,OpenAI 没有发布完整版本的模型,而是发布了一个轻量级版本。他们在自己的博客中提到了这件事:
由于我们担心该技术的恶意应用,我们不会发布经过训练的模型。作为负责任披露的一项实验,我们发布了一个小得多的模型供研究人员进行实验,以及一篇技术论文。
由于这个原因,它制造了许多关于没有最新型号和源代码可供公众使用的噪音。应该研究开放模型和源代码吗?OpenAI 确实引发了很多讨论,但似乎大多数反馈都是负面的。忽略它是否应该开放,这个故事将讨论关于语言模型是无监督的多任务学习者(拉德福德等人,2019),并将涵盖以下内容:
- 数据
- 体系结构
- 实验
- 经验
数据
资料组
Reddit Logo
OpenAI 没有使用现有的数据集,而是选择建立一个新的强调文档质量的网络抓取工具。所有文字来自出站克林从 Reddit 职位和职位必须被评为至少 3 因果报应。换句话说,它是由人类确认的有趣的、有教育意义的或有意义的事情。
数据预处理
不需要预处理步骤。换句话说,小写、标记化和其他步骤被跳过,因为作者认为这些预处理步骤限制了模型的能力,并且它能够评估所有语言模型基准。
GPT 2 号的建筑
输入表示
文本表示法是一种很好的表示方法,一个词在神经网络中无疑是真实的。然而,拉德福德等人既不适用字级也不适用字级。他们选择中间的一个子词。子字可以通过字节对编码(BPE)算法获得。
***【BPE】***字节对编码
BPE 本来就是压缩的方式。将使用以下算法计算子字列表。
- 将单词拆分成字符序列。
- 加入最高频率模式
- 继续执行上一步,直到达到预定义的最大迭代子词数。
以“低:5”、“低:2”、“最新:6”和“最宽:3”为例,在每次迭代中提取最高频率的子字:
- 9 个频率的“es”
- 9 个频率的“est”
- 等等
Algorithm of BPE (Sennrich et al., 2015)
网络体系结构
同 GPT ,GPT-2 利用变压器模型。而 GPT 和 GPT-2 的区别在于:
- 将归一化层移动到每个子块的输入端
- 在最终自我关注模型后添加标准化层
Architecture of GPT (Radford et al., 2018)
为了适应不同场景,训练了具有不同参数的 4 个模型
Architecture Hyperparameters (Radford et al., 2019)
模特培训
GPT-2 使用无监督学习方法来训练语言模型。不同于其他模型,如 ELMo 和 BERT 需要两个阶段的培训,即预培训和微调阶段。GPT-2 没有微调阶段。
没有 GPT-2 的定制培训。OpenAI 不发布训练 GPT-2 的源代码(截至 2019 年 2 月 15 日)。因此,我们只能将训练好的模型用于研究或采用。同时,唯一发布的训练模型是最小的模型,有 117 个参数。要下载这个模型,你可以按照 GPT-2 Github 中的说明进行。
实验
拉德福德等人证明了最大的模型(即 1542M 参数)达到了 8 个最先进的结果,而最小的模型达到了 4 个最先进的结果。
Result of 4 models in different dataset (Radford et al., 2019)
经验
很容易尝试 GPT-2 小型模型。你只需要遵循来自 GPT-2 Github 的简单指令。下载源代码和模型并安装库后,可以使用unconditional sample generation
或conditional sample generation
生成文本。
无条件样本生成
第一种模式是Unconditional Sample Generation
。它意味着无条件地生成文本。
python src/generate_unconditional_samples.py
过一会儿,会生成一些文本,这里是一个例子:
Most people think that when a warship runs aground it doesn't just kill people and then sink or burn all of society. That would make L.S. Kaminsky blush. Yet Kaminsky is doing one thing right: the CREAPH presidency. Whoever he is that fired the salt gun after getting thrown out of the Senate tossup race here in Richmond, he runs the "war," real, that is, guys like Alvin Dream, Dennis Hastert and Vijay Swarup. Given that Ed Gillespie, the GOP nominee barely a month into the campaign, on May 2 earned 45 points from the Tea Partiers, secessionists and nativities, right much everyone under 30 has been cheering the idea of "the war." Elliot Abrams, one of the Campus Reform editorial staff writers, also called the "war" mundane in the broadest terms. "Oh, well with them suiting it up voting be vigilant. And that produces 14 Rand Paul a grand total of 50 but Johnson 53\. Two just finished with a 45 for Johnson 46\. 'Well I hope it keeps getting led!' No, it's to save your mates from gun sin," wrote James Hernandez in New York to figure out what was going on. Ditto Bob Corker, who greeted the notion this far by saying it was "a dip in accuracy." As for the Rand Paul and Marco Rubio brilliant running mates like Thad Execury (FML) — who are now both running for president estranged from their father, John Doe III, and miscarried by accident — it's just another rebel outside cover.
您也可以通过更改默认配置来生成文本。温度是随机化的水平。较低的值很有可能从 WebText 的测试集中输出数据。
python src/generate_unconditional_samples.py --top_k 1 --temperature 0.1
输出可以是:
The first time I saw the new version of the game, I was so excited. I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game, I was so excited to see the new version of the game,
条件样本生成
在无条件文本生成之后,我们将尝试有条件文本生成。
python src/interactive_conditional_samples.py --top_k 40
让我们试试香港乐队(法玛)的一首歌词
Reply of “I go to school by bus”
让我们试试来自爱莉安娜·格兰德的 7 枚戒指:
Reply of “Yeah, breakfast at Tiffany’s and bottles of bubbles.”
拿走
- 使用子词(BPE)而不是使用字符和单词嵌入。也许单词嵌入的层次太高,而纯字符嵌入的层次太低。BPE 包括字符级、子词级和词级嵌入。
- 数据很重要,但标记数据的成本很高。拉德福德等人使用高质量的数据进行无监督学习,这样他们可以避免有限的标记数据问题。如前所述,至少选择 3 个因果报应数据。换句话说,这是一种人群过滤。
- 通过对预先训练好的模型进行多次尝试,得到了令人印象深刻的结果。这是 OpenAI 不公开发布所有内容的原因吗?不知道,但有一点是肯定的,这是一个非常好的营销,OpenAI 忽略了许多负面反馈。期待最大的模型和源代码。
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客、 LinkedIn 或 Github 联系我。
延伸阅读
参考
- A.、吴、蔡尔德、栾、阿莫代和苏茨基弗。语言模型是无人监督的多任务学习者。2019
- A.拉德福德、K. Narasimhan、T. Salimans 和 I. Sutskever。通过生成性预训练提高语言理解。2018
- R.森里奇 b .哈多和 a .伯奇。具有子词单元的生僻字的神经机器翻译。2015
对任何机器学习项目至关重要的工具/技巧
from pixabay here
这是系列“如何利用 LSTM 预测股价”的最后一篇帖子。在上一篇文章中,我们已经看到了如何微调神经网络的超参数。在这篇文章中,我将提到一些对于任何 ML 项目来说都是常见和不可或缺的组件,但是它们经常被忽略(甚至我最初也是这样做的)。
记录
在早期阶段,这似乎是一种开销,但是我们不能夸大日志在调试任何应用程序中的作用。python 中的日志很简单,但是我们必须做一些初始化来使它更有效。以下是我所做的。
这段代码带有注释,非常容易理解。您也可以添加其他处理程序。一旦您设置了日志程序,实际的日志记录就很简单了:
logging.debug("Train--Test size {} {}".**format**(**len**(df_train), **len**(df_test)))
当您有一个 bug,但不知道它来自哪里时,日志可以证明是一个分析残骸的黑盒。
形象化
视觉化是另一个有时被忽视的领域。绘制训练误差与验证误差以及预测与真实数据的关系图对于理解正在发生的事情是绝对必要的,尤其是在涉及如此多参数的神经网络中。为了绘制误差图,我们需要存储所有时期的所有误差。它真的有助于识别过度拟合/欠拟合。使用 Keras 非常简单:
同样,您可以绘制预测值与实际值的对比图,以寻找任何异常。我给你举个例子。对于这个项目,在最初的试验中,我只关注最初的预测值,它们总是不太好。但当我开始绘制整个预测时,我意识到由于某种原因,该模型仅在测试数据的初始部分做得不太好。但是时间线的其他部分都很好。见下文。
To realise that model performance over the complete test set is not so bad, we need bigger picture
虽然我很确定这可以通过更多的调整得到进一步的改善。
释放 Keras
虽然我在这里使用 Keras 作为例子,但是在您熟悉的任何其他工具中也应该有类似的工具。
- CSVLogger :顾名思义,它可以用来在每个时期结束时记录各种变量。默认情况下,它存储纪元编号、列车丢失和验证丢失。但是也可以存储你自己的变量。本节末尾包含所有要点的示例代码。
- 提前停止:如果 Keras 检测到长时间没有改善,用于停止训练。有各种属性来定义系统何时应该停止,如“耐心”,它说明在宣布模型没有改善之前,Keras 应该允许运行多少个时期。类似地,“min_delta”是另一个有用的参数。可以想象,这些参数会因不同的问题而有所不同。例如,你必须监控你的验证损失随着时代的变化有多少(这也取决于你的学习速度)。这就是日志记录派上用场的地方。你可能会想,我的训练每一个时期需要 10 秒钟,如果我的训练不提前停止,再多跑 30 个时期,对我来说没问题;我可以抽出 5 分钟,或者我会手动停止。但是回想一下以前的文章,我们使用了各种自动化超参数调优工具和网格搜索。你不能控制每一次迭代。如果你要检查 50 个组合,并且每个组合节省了 5 分钟(这实际上比那个多得多,因为可能有许多组合只是坏)那么你就节省了 250 分钟!但是不要为“耐心”使用太小的值否则系统会过早停止,即使它可以在更多的时期后得到改善。
- ModelCheckpoint :如果‘save _ best _ only’为真,则该回调在每个时期后保存训练好的模型,或者只保存所有时期中最好的一个。同样,这在自动化大量参数组合搜索时非常方便。
以结构化的方式保存所有数据,以便以后分析
就像一般生活一样,在机器学习中,我们可以从回顾中学到很多东西。做得不太好的训练(有一些超参数组合)也能给出一些有价值的见解。例如,让我们假设您正在调整辍学率或学习率。如果您已经保存了以前训练的所有数据,那么您可以比较在 150 个纪元时的训练损失,从而决定模型是否学习得更快。或者你甚至会发现一些有趣的东西,可以应用到你的下一个项目中。
对于这个项目,我将每次更改/尝试的结果存储在一个文件夹结构中,如下所示:
我想以此结束这篇文章和我的博客系列。我希望我能对所有的 ML 粉丝有所帮助。
因为我是从预测 ML 公司的股票价格开始这个系列的,所以在结束之前我想说几句。虽然我们发现我们可以预测未来的价格有一定的准确性,但它仍然不适合捕捉特殊情况(基于其他市场因素的突然价格变化)。这里的目的不是完全解决问题(尽管如果我们找到一种方法将其他因素整合到我们的问题陈述中,我们可以做到),而是意识到,我们可以用机器学习,坐在家里,用我们平庸的笔记本电脑做什么。这就是机器学习的力量。
继续编码。
10 大人工智能新闻:11 月回顾
今年 11 月,人工智能世界发生了什么
- 澳大利亚开始在交通摄像头上使用计算机视觉来检测人们在开车时使用手机的情况。
- 英国批准了一项动议,对无法解释人工智能如何影响其决策的公司进行罚款。这预计将于 2020 年生效。
- 著名围棋冠军李世石(Lee Se-dol)退出,并称 AI 是“无法被打败的实体”。
- 反对人类的卡片现在正在使用人工智能来编写他们的卡片,这可能为如何用人工智能取代创造性工作的人开创了一个先例。
- 现在,胎盘正在用计算机视觉进行分析,以改善对母亲和新生儿的临床护理。开发者的目标是通过在智能手机上部署他们的软件来实现这一实践。
- 脸书发布了一种类似人类的“外围视觉”GAN,称为 DeepFovea,能够重建只有 10%像素的图像。
- IBM 与 Unitary Fund 合作,鼓励与量子计算相关的开源项目。
- 苹果发布了一篇论文,其中他们表明智能手机的使用可以用来预测认知障碍。
- Python 3.8 现已推出。
- Lyft 以开源方式发布了它的 ML 平台 Flyte。
数据科学家犯的 10 大编码错误
数据科学家是“比任何软件工程师更擅长统计,比任何统计学家更擅长软件工程的人”。许多数据科学家有统计学背景,但对软件工程几乎没有经验。我是一名高级数据科学家,在 python 编码的 Stackoverflow 上排名前 1%,与许多(初级)数据科学家一起工作。以下是我经常看到的 10 个常见错误。
1.不要共享代码中引用的数据
数据科学需要代码和数据。因此,为了让其他人能够复制你的结果,他们需要能够访问这些数据。看起来很简单,但是很多人忘记了与他们的代码共享数据。
import pandas as pd
df1 = pd.read_csv('file-i-dont-have.csv') # fails
do_stuff(df)
解决方案:使用 d6tpipe 与您的代码共享数据文件,或者上传到 S3/web/google drive 等,或者保存到一个数据库中,以便接收方可以检索文件(但不要将它们添加到 git 中,见下文)。
2.硬编码不可访问的路径
类似于错误 1,如果你硬编码了其他人不能访问的路径,他们就不能运行你的代码,并且不得不寻找很多地方来手动改变路径。Booo!
import pandas as pd
df = pd.read_csv('/path/i-dont/have/data.csv') # fails
do_stuff(df)# or
impor os
os.chdir('c:\\Users\\yourname\\desktop\\python') # fails
解决方案:使用相对路径、全局路径配置变量或 d6tpipe 来使你的数据易于访问。
3.将数据与代码混合
既然数据科学代码需要数据,为什么不把它转储到同一个目录中呢?当你这么做的时候,把图片、报告和其他垃圾也保存在那里。呀,真是一团糟!
├── data.csv
├── ingest.py
├── other-data.csv
├── output.png
├── report.html
└── run.py
解决方案:将你的目录分类,比如数据、报告、代码等等。参见 Cookiecutter Data Science 或 d6tflow 项目模板并使用#1 中提到的工具来存储和共享数据。
4.Git 用源代码提交数据
大多数人现在控制他们代码的版本(如果你不这样做,那是另一个错误!!参见 git 。为了共享数据,将数据文件添加到版本控制中可能很有诱惑力。这对于非常小的文件来说是可以的,但是 git 并不适合数据,尤其是大文件。
git add data.csv
解决方案:使用#1 中提到的工具来存储和共享数据。如果你真的想要版本控制数据,参见 d6tpipe 、 DVC 和 Git 大文件存储。
5.编写函数而不是 Dag
数据说够了,让我们来谈谈实际的代码!由于学习编码时首先要学习的是函数,因此数据科学代码通常被组织成一系列线性运行的函数。这导致了几个问题,参见你的机器学习代码可能不好的 4 个原因。
def process_data(data, parameter):
data = do_stuff(data)
data.to_pickle('data.pkl')data = pd.read_csv('data.csv')
process_data(data)
df_train = pd.read_pickle(df_train)
model = sklearn.svm.SVC()
model.fit(df_train.iloc[:,:-1], df_train['y'])
解决方案:与其线性链接函数,不如将数据科学代码编写为一组任务,这些任务之间存在依赖关系。使用d6t 气流或气流。
6.编写循环
像函数一样,for 循环是你学习编码的第一件事。容易理解,但是它们速度慢且过于冗长,通常表明您不知道矢量化的替代方法。
x = range(10)
avg = sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x));
zscore = [(i-avg)/std for x]
# should be: scipy.stats.zscore(x)# or
groupavg = []
for i in df['g'].unique():
dfg = df[df[g']==i]
groupavg.append(dfg['g'].mean())
# should be: df.groupby('g').mean()
解决方案: Numpy 、 scipy 和 pandas 对大多数你认为循环可能需要的东西都有向量化函数。
7.不要写单元测试
随着数据、参数或用户输入的变化,您的代码可能会中断,有时您并没有注意到。这会导致糟糕的结果,如果有人根据你的结果做决定,糟糕的数据会导致糟糕的决定!
解决方案:使用assert
语句检查数据质量。 pandas 有相等测试, d6tstack 有数据接收检查, d6tjoin 有数据连接检查。数据检查示例代码:
assert df['id'].unique().shape[0] == len(ids) # have data for all ids?
assert df.isna().sum()<0.9 # catch missing values
assert df.groupby(['g','date']).size().max() ==1 # no duplicate values/date?
assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all ids matched?
8.不要记录代码
我明白了,你急着做分析。你把事情拼凑起来,把结果交给你的客户或老板。然后一周后他们回来说“你能改变 xyz 吗”或者“你能更新这个吗”。你看着你的代码,却不记得你为什么要这么做。现在想象其他人必须运行它。
def some_complicated_function(data):
data = data[data['column']!='wrong']
data = data.groupby('date').apply(lambda x: complicated_stuff(x))
data = data[data['value']<0.9]
return data
解决方案:花额外的时间,即使是在你完成分析之后,来记录你做了什么。你会感谢你自己,别人会更感谢你!你会看起来像个专业人士!
9.将数据保存为 csv 或 pickle
背数据,毕竟是数据科学。就像函数和 for 循环一样,CSV 和 pickle 文件是常用的,但它们实际上并不是很好。CSV 不包含模式,所以每个人都必须再次解析数字和日期。Pickles 解决了这个问题,但是只能在 python 中工作,并且没有被压缩。这两种格式都不适合存储大型数据集。
def process_data(data, parameter):
data = do_stuff(data)
data.to_pickle('data.pkl')data = pd.read_csv('data.csv')
process_data(data)
df_train = pd.read_pickle(df_train)
解决方案:使用带有数据模式的 parquet 或其他二进制数据格式,最好是压缩数据的格式。 d6tflow 自动将任务的数据输出保存为 parquet,这样你就不用处理了。
10.使用 jupyter 笔记本
让我们以一个有争议的问题来结束:jupyter 笔记本和 CSV 一样普遍。很多人都在用。这并不意味着他们是好人。Jupyter 笔记本助长了上面提到的许多坏的软件工程习惯,特别是:
- 您很想将所有文件都转储到一个目录中
- 您编写自顶向下运行的代码,而不是 Dag
- 你没有模块化你的代码
- 难以调试
- 代码和输出混合在一个文件中
- 他们没有很好的版本控制
感觉很容易上手,但是扩展性很差。
基于谷歌地图的十大客户友好国家
根据谷歌地图的数据,创建一个“顾客友好国家”指数
一切都始于布鲁塞尔!
比利时布鲁塞尔-2018 年 8 月 11 日。我第一次访问这个城市,作为我等待已久的欧洲之旅的一部分,这是一个阳光明媚的星期六早上,我醒来,吃了早餐,然后去一家受欢迎的咖啡馆喝了第一杯咖啡,你猜怎么着…这是一个可怕的经历!
工作人员很粗鲁,不灵活,他们有一些愚蠢的规则,什么可以做,什么不可以做,并增加了等待服务的长队。像任何沮丧的顾客一样,我直接去谷歌地图给他们一个差评,却发现其他人已经这样做了。
这次经历让我目瞪口呆,我产生了内心的斗争;我是应该用这次经历来评判整个城市还是干脆无视,再给布鲁塞尔一次机会:)
我决定选择后者,这时候我有了一个想法💡在我脑海中闪现…
能否通过汇总谷歌地图的点评数据来判断一个国家的友好程度!?
挑战
回答这样的问题是困难的、具有挑战性的和棘手的。然而,这个月我开始着手做这件事,我设法进行研究,用数据来回答这个问题,遵循以下步骤:
- 定义一个假设:“如果我们对一个国家的餐馆和咖啡馆进行抽样调查并汇总评论得分,排名靠前和靠后的国家之间会有显著差异”,从而找出友好国家和不友好国家
- 获取数据**:从谷歌地图 API 获取每个国家的评论的统计样本——我决定只关注 餐馆&咖啡馆首都城市****
- ****清理数据,例如删除评论人数少的咖啡馆
- ****分析数据并确保结果有意义,这包括 统计测试
- 可视化并总结结果
更多的技术和统计细节可以在文章末尾的 方法论&统计 部分找到
结果
对 153 个国家(首都城市)的分析显示 排名靠前和垫底国家的综合评估得分均值之间存在明显的统计显著差距 。*
*由于缺乏足够的数据,91 个国家被排除在外
我还发现数据中所有国家的平均谷歌地图评论分数为 4.31 分,最低 2 分,最高 5 分
Boxplot chart for all review scores in all countries
接下来,您将找到更多关于排名靠前和靠后的国家的信息
测验:现在停下来想一想……你认为你的国家会排在名单的哪个位置:顶端、底端还是中间?
十大国家
根据平均评审分数查找以下 10 个国家
Top 10 Countries (capitals) based on Aggregated Review Scores (horizontal lines shows the IQR, point size denotes the average number of reviews per restaurant or cafe — 365.7 for Bosnia, color is random)****
垫底 10 个国家
根据平均评估分数,排名最差的 10 个国家
Bottom 10 Countries (capitals) based on Aggregated Review Scores (horizontal lines shows the IQR, color is random)****
国家友好世界地图
在这里,您可以找到按每个国家的平均点评分数着色的世界地图
Countries colored by average review score (lighter is better )— white means no data
以下是按每家咖啡馆或餐厅的平均点评数量进行着色的国家
Countries colored by average number of reviewsper cafe or restaurant — lighter is higher
国家友好指数—完整列表
最后,所有国家和分数的完整列表…
Country Friendliness & Service Quality Index — 2019
“大陆”友好度地图
下面是世界地图,用颜色表示按“洲”汇总的平均点评分数
Continents colored by average review score (lighter is better ) — white means no data
统计显著性检验
除了数据分布中明显的视觉差异之外,对排名靠前和垫底国家的数据点进行了尾部 t 检验,结果证实了最初的假设,审查得分均值的差异具有统计学意义,其 p 值为:0.00000000000000002
下面你可以看到这两个国家的评论分数分布图
Distribution (KDE) of review scores for top & bottom countries
用户评论分析
下图显示了按评审分数汇总的评审者使用的热门短语
Aggregated word clouds (Tri-grams) by review scores range
我们可以在这里看到一些模式
- 对于那些评价高于平均水平(4.31+)的人,你可以看到他们的热情和对“员工友好”的重视
- 对于得分平均或低于平均(低于 4.31)的地方,更多关注“地方”和“食物”,热情较低(较少“非常”和“很好”)
- 差评在 2-3 之间的地方主要与价格有关(这里的数据并不充分,因为只有 3 家商店在这个范围内)
- 你也注意到红色区域的德语文本了吗?…任何德国人或生活在德国的人都会知道为什么:)
名人墙
在这里,我展示了一个具有出色的 5 星级评分的咖啡馆的例子
我从没想过有人会得到数百人一致的 5 星评价,我很好奇你——读者——对此有何解释!
布加勒斯特的一家咖啡馆
耻辱之墙
现在是谷歌地图的一个坏例子的时候了
**罗马的咖啡馆获得了 **2 星的一致评级,主要的痛点似乎是极端和透明的价格
结论
在这篇文章的开始,我问了下面这个问题
“我们可以通过汇总谷歌地图的评论数据来判断一个国家的友好度吗!?"****
现在,在研究结果出来后,我可以自信地说是的,但有一点小小的变化** …正如我们一起看到的,(名声/耻辱墙)评论并不总是转化为友好,它可能是关于价格、清洁、速度等…因此,总体而言,评价是关于友好度和服务质量的,因此我将把这句话改为**
“能否通过汇总谷歌地图的点评数据来判断一个国家的友好度&服务质量**!?"**
这就是为什么这篇文章的标题是“基于谷歌地图的十大客户友好国家”
谷歌地图是座金矿
在我看来,谷歌地图是一个非常有价值的数据来源,可以带来各种各样的机会,例如,你可以在地图上构建应用程序,以提供基于评论文本的智能标记搜索——比如“给我找一家目前不拥挤的咖啡馆”**
*** * Google 的功能请求:)**
也就是说,请注意从谷歌地图获取数据是昂贵的,我为这项研究支付了大约 150 欧元
结果有意义吗?
定义“意义”…就个人而言,结果并没有证实我最初的偏见,我仍然不明白为什么国家以这种方式排名,为什么巴尔干半岛的 3 个国家占据了前 5 名(以前从未出现过)
可能有许多因素影响结果,例如主导评论的人群(可能是游客),该国的评级文化——比如他们倾向于给出好评或差评,该国的发达程度,该国服务业的质量,以及公民的文化和友好程度
请在评论中告诉我你对这些结果的看法
你个人如何使用这些数据?
- 你可以将你的店铺评论分数与国际平均分数 4.31 或者你所在国家的当地平均分数进行比较
- 现在你知道提供优质服务、美食和友好员工的首都城市列表了:)
- 你知道应该关注什么来获得高于平均水平的评价分数(1-员工友好度 2-食品质量 3-地点和价格)
进一步研究
我很想知道这些数据与其他指数如联合国人类发展指数(T1)、T2 zendex 客户服务指数(T3)有什么关联。如果您想对数据做进一步的分析,您可以在这里访问聚合结果 CSV 文件。
方法论和统计学
关于这项研究的一些详细的技术信息
- ****21807 个数据点已经使用Google Maps Places API获取
- 只获取了每个首都城市的餐馆和咖啡馆的数据****
- 选择的样本量范围为每个城市 60-120 家咖啡馆/餐厅,以达到 95%置信区间和 10%误差范围的统计显著性。总人口(根据城市规模,假设每个城市的餐馆数量为 1,000 至 30,000 家)
- 删除所有评论数量少于 10 的咖啡馆/餐厅,以避免偏见(16%的数据)****
- 删除任何不符合 60 家咖啡馆/餐厅目标样本量的国家/地区——特别是在上述清理步骤之后****
- 这样,从谷歌地图上获取的最初 242 个国家中,只剩下 15727 个数据点和153 个国家(由于数据大小和质量原因,91 个国家被排除在外)
密码
我很乐意在下面的 Github 存储库中分享数据提取和分析代码,但是由于服务协议的条款,我不能分享获取的谷歌地图数据
https://github.com/karimouda/country-friendliness-index
信用
我要感谢 Hamza Ibrahim 、 Hany Ouda 、 Mostafa Nageeb 花时间审阅本文并提出宝贵意见。
关于我
我目前是柏林数据和产品领域的自由顾问。数据不仅是我的工作,也是我的热情所在,我在 2012 年创建我的分析初创公司时开始爱上数据,后来我决定通过攻读数据科学硕士学位来更深入地了解它,我还曾经在 Kaggle.com 上参加比赛,当我有时间时,我会不时地做一些像这样有趣的研究:)你可以在这里找到更多关于我的信息:https://karim.ouda.net
您应该关注的 10 大数据科学领导者
如果你是一名数据科学家
我始终相信,为了有效地学习,我们必须向最优秀的人学习。
如果你一直在关注我的工作,我两年前作为一名物理系学生开始学习数据科学,对数据科学一无所知。
我设法在一年内从物理科学过渡到数据科学。
的确,我挣扎了很多。我犯了很多错误。
我失败了。振作起来。又往前走了。
当我回顾我的数据科学之旅以及我已经走了多远时,在我的整个学习之旅中,真正让我加快速度的是我学到了(而且还在学!)来自最优秀的数据科学领导者,他们是数据科学领域的专家。
这极大地帮助了我成为一名数据科学家的数据科学之旅,因为他们定期分享他们在数据科学方面的真实生活经验、正在使用的最新技术和工具、技术和非技术知识以及许多其他知识…
事实上,这些数据科学领导者只是 LinkedIn 上令人敬畏的数据科学社区的一部分,他们激励我通过在 LinkedIn 和 Medium 上分享我的经验和知识来回馈社区。
因此,你现在正在阅读这篇文章(以及其他关于媒介的文章)。
如果你在数据科学领域,我强烈建议你关注这些巨头——我将在下面的部分列出这些巨头——并成为我们数据科学社区的一员,向最优秀的人学习并分享你的经验和知识。
我们开始吧!
您应该关注的 10 大数据科学领导者
1。兰迪·劳
兰迪老认真牛逼。事实上,他是我刚起步时关注的第一个数据科学领导者,对数据科学一无所知。
如果你是一名有抱负的数据科学家,我强烈推荐你去看看他的网站,那里有所有有用的免费数据科学和机器学习资源与你分享。
最重要的是,他还是数据科学梦想工作的数据科学导师,这是一个帮助有抱负的数据科学家成长和获得工作的电子学习平台,由凯尔·麦基乌创立。
凭借他在数据科学领域的分享和丰富经验,我相信您会从他那里学到很多东西,我也是。
2。凯尔·麦基乌
如果你是 LinkedIn 的活跃用户,你可能已经听说过他的名字。
如前所述,Kyle 是 数据科学梦想工作 的创始人,该公司教授来自不同背景的有抱负的数据科学家如何在数据科学领域找到工作。
这门课程本身比任何东西都有价值,因为他和其他出色的导师向有志的数据科学家传授思维方式、技术和非技术技能、求职技巧以及如何最终在这个行业开始职业生涯。
这不仅仅是 Udemy 或 Coursera 上的另一门只教授编程或机器学习技术技能的在线课程。
Kyle 还定期在 LinkedIn 上与数据科学社区分享他在数据科学方面的经验和见解。
如果你想进入数据科学领域——即使你没有任何背景——那么跟随凯尔,看看他的课程。
3。基里尔·叶列缅科
基里尔·叶列缅科是数据科学家在线教育门户网站 SuperDataScience 的创始人兼首席执行官。
该公司的使命是“化繁为简”,愿景是成为数据科学爱好者最大的学习门户。
此外,该平台还提供数十种分析课程,从 R 编程、Python、Tableau 等基于工具的课程到机器学习 A-Z 和数据科学导论等综合课程。
我个人最喜欢的课程:深度学习 A-Z:动手操作的人工神经网络由基里尔·叶列缅科和哈德琳·德·庞特维斯教授。这是我第一次接触深度学习,相信我,他们的课程真的是独一无二的,非常强调本能的理解水平,有监督和无监督深度学习的动手编码教程。
最近,我有机会读了他的书— 自信的数据技能 ,这本书帮助你理解从项目开始到结束的完整数据科学工作流程,全部零代码!
4。法维奥·巴斯克斯
Favio Vázquez 在数据科学方面有着丰富的经验,他总是愿意毫无保留地在 LinkedIn 上分享他的想法和见解。
就我个人而言,我是他的 YouTube 频道之一的粉丝——数据科学办公时间,与其他令人惊叹的数据科学领导者分享他们在不同主题中的经验。
光是从他们的网络研讨会上,我就无法告诉你我学到了多少。
因为到最后,作为一个有抱负的数据科学家,你可以参加很多在线课程和证书,尽可能多地学习。但是,如果你不能理解数据科学家如何在真实的工作环境中工作,你将无法应用你从这些课程中学到的东西。
你将无法理解作为数据科学家的角色。
所以,向数据科学家学习一直是我首选的学习和探索方式。
5。埃里克·韦伯
Eric 是 LinkedIn 的高级数据科学家,现在在 CoreLogic 担任数据管理和数据科学的负责人。
我非常喜欢 Eric 的一点是他对当前数据科学领域的敏锐观察。
他总是愿意分享他的知识和经验,以揭开数据科学中一些常见但被遗忘的领域的神秘面纱,这些领域从未让我感到惊讶。
Eric 是我加入 LinkedIn 数据科学社区以来一直关注的数据科学领导者之一。有太多的东西要向他学习,我迫不及待地想在未来与你分享!
6。凯特·斯特拉奇尼
凯特以《颠覆者 T2:数据科学领导者》一书的作者而闻名。
她也是数据化周刊的主持人,这是一个致力于帮助其他人了解数据领域各种主题的项目,她还是 YouTube 数据频道的数据科学人类(HoDS)的主持人。
在本文中,她还采访了一些数据科学的领导者,所以如果你想了解数据领域的各种主题,我强烈建议你去看看她的 YouTube 频道。
Humans of Data Science (HoDS) with Favio Vázquez
您可能已经意识到,LinkedIn 上的数据科学社区是一个联系紧密的社区,我们在这里相互交流,分享和共同学习。
7。塔利·辛格
Tarry Singh 是 deepkapha.ai 的创始人兼首席执行官,该公司除了为人工智能研究和慈善事业做出贡献外,还为公司和企业带来人工智能解决方案。
Tarry 在使用深度学习和人工智能解决现实世界问题方面的热情启发了我,在我刚开始从事数据科学时,我就用数据来回报社会。
关注他的工作和分享。你会对他的想法和分享感到惊讶,尤其是在人工智能的最新前沿技术上。
8。伊马德·穆罕默德·汗
Imaad Mohamed Khan 目前是 Indegene 的数据科学家。
他的帖子总是如此鼓舞人心,并且对数据科学中的任何话题都一针见血。
此外,Imaad 还不定期在印度组织尾数数据科学会议,让大家有机会在一起学习的同时分享和表达自己的想法。
他绝对是我一直期待向其学习的数据科学家之一。
9。安德烈亚斯·克雷茨
每当我们谈论数据科学时,大多数人都倾向于认为这都是关于建立很酷的机器学习模型和做出令人敬畏的预测。
实际上,构建模型只是整个工作流的一部分,而数据工程(也称为数据科学的管道工)是支持数据科学项目的工作流的关键部分。
如果没有一个稳定和可靠的数据工程管道和平台,一开始就很难获得数据来执行任何分析。
谈到数据工程和构建大数据平台以支持数据科学项目,Andreas 是真正的专家。
他是一名数据工程师和数据科学平台架构师,构建每天处理和分析海量数据的数据科学平台。
如果你想了解更多关于数据工程的东西,比如 Hadoop、Spark 和 Kafka,可以去看看他的 YouTube 频道——数据科学的管道工。
What is Plumbers of Data Science? — by Andreas Kretz
10。安德烈·布尔科夫
Andriy——Gartner的数据科学总监兼机器学习团队负责人——可以被认为是 LinkedIn 上的数据科学领导者和名人之一,他的畅销书是百页机器学习书籍。
他的这本受欢迎的书已经被翻译成不同国家的不同语言(甚至被一些大学的图书馆和课程收录为教材!).
他还定期分享大量有用的数据科学技巧(几乎每天!)在 LinkedIn 上,我相信你不会想错过的。
最后的想法
感谢您的阅读。
这里的数据科学领导者名单绝非详尽无遗。这些只是我两年前开始从事数据科学工作时跟随和学习的一些顶级数据科学领导者。
直到现在,我每天都在学习他们的分享和经验。
受到他们贡献的启发,我正在通过分享我的知识和经验来回馈数据科学社区,希望能够帮助更多有抱负的数据科学家。
最终,作为数据科学社区的一员,我们在这里,并将永远在这里分享、帮助、学习和共同成长。
这就是一个社区的意义所在。
我希望你喜欢阅读这篇文章。
记住,不断学习,永不停止进步。
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq — 的联合创始人/首席技术官。
想要获得免费的每周数据科学和创业见解吗?
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)
数据可视化中的 10 大地图类型
为什么大家都喜欢用不同的地图类型来可视化新闻媒体或者数据分析报告中的信息?
除了传递信息的效率高,还有一个重要原因,就是审美。再无聊的内容,只要配上酷炫的地图,都会让人眼前一亮。
地图可视化用于分析和显示地理上相关的数据,并以地图的形式呈现出来。这种数据表达更加清晰直观。我们可以直观的看到各个区域的数据分布或者比例。方便大家挖掘更深层次的信息,做出更好的决策。
地图可视化有多种类型,如行政地图、热图、统计图、轨迹图、气泡图等。地图可分为 2D 地图、3D 地图或静态地图、动态地图、交互式地图……它们通常与点、线、气泡等结合使用。在本文中,您将找到数据可视化中 10 大地图类型的示例!
(注:文中所有地图类型均用 FineReport 制作,个人下载完全免费。)
1.点地图
点地图非常简单,尤其是在显示地理信息分布广泛的数据时。比如有的公司业务范围很广。如果公司要查看某个区域内各个站点(具体位置)的数据,用一般的地图实现起来会比较复杂,精度不高。然后就可以利用点图进行精准快速的定位了。
使用场景:点事件分布。点地图还可以实现大事件的特殊识别。和上面的事故追踪图一样,可以用图片、文字或者动态效果识别相对严重的事件。
2.平面图
你可能不会经常使用线图,因为它们相对来说比较难画。但是,线图有时不仅包含空间,还包含时间。对于特殊场景的分析,其应用价值特别高。
使用场景:骑行或驾车的路线分布,公交或地铁线路分布,比如上图中纽约市的出租车路线。
3.区域地图
区域地图也称为填充地图。可以按国家、省、市、区甚至一些定制地图显示。你可以通过地图上颜色的深浅或者不同的颜色来知道数据的大小。
使用场景:某个特性在不同地区的分布。可以实现从省到市的分步钻探。它可以用不同的颜色或标签来表示不同的特征。例如,在上图中,我们可以从省到市向下钻取数据来查看销售情况。销量越大,颜色越深。
4.流程图作业图
流程图通常用于可视化始发地-目的地流程数据。起点和终点可以是点或曲面。始发地和目的地之间的交互数据通常用连接空间单元的几何重心的线来表示。线条的宽度或颜色表示起点和终点之间的流向值。每个空间位置可以是起点或终点。
使用场景:区域间贸易、交通流量、人口迁移、购物消费行为、通讯信息流、航空航线等。
5.热图
热图用于显示地理范围内每个点的权重。它通常以特别突出的方式显示。如下图所示,是一张雾霾图。该地区的颜色越深,该地区的空气质量越差。
使用场景 : PM 2.5 分布、注册日期和年龄分布、产品偏好分布等。
6.热点图
热点地图是热点地图和点地图的综合应用。与热图相比,其识别的准确率可以更高。而且和点图相比,它的点其实是一个圆,圆之间相互重叠,更有层次感。
使用场景:显示地理范围内各复杂点的权重。比如上面的公交车站使用图,人越多点越大,颜色越深。也可以确定最大和最小人数。
7.时空分布图
这种地图显示了具有时间和空间信息的轨迹分布。他们可以记录每个点的时间和空间分布。
使用场景 : GPS 地理追踪等。
8.数据空间分布图
我们用一个具体的例子来解释这张地图。下图是轨道交通客流空间分布图。不同的颜色标识不同的线路(更直观),线路的粗细表示不同站点的车流量(类似于热点)。线越粗,流量越大。它还可以指示轨迹线的方向。
使用场景:通过这种可视化效果,运营者可以清楚地知道某一时间段的客流分布情况,从而合理安排运营(如员工数量等。).
9.三维矩形地图
这种类型的地图是点地图的升级版本。点的形状各不相同,包括这种三维矩形。
使用场景:点地图的所有场景。它更侧重于特定对象的地理分布,如房地产建设项目。
10.自定义地图
自定义地图是您自己设计的地图可视化。可以满足任何使用场景,但是需要一定的数据分析和可视化设计基础。所以我就不多说了,只给大家看两张我做的自定义地图。
终于
读到这里,你可能会问你应该使用什么工具来制作地图可视化。我觉得没必要强调工具的选择。Excel,D3,甚至 PS 都可以做你想做的。你应该多想想你使用这些工具的主要目的。
如果只是想展示处理后的数据,可以选择 Excel。又或许你有各种各样的数据,但是你不懂数据建模、编程,或者数据清洗,甚至 SQL 优化,那么你就需要一个像 FineReport 和 Tableau 这样简单易用的数据可视化工具。我在本文中制作的地图看起来可能有点难画,但我实际上使用了 FineReport 的内置地图模板。通过简单的拖放操作,数据可以很容易地可视化。
总之,上面提到的工具都有地图可视化的功能,只是有区别。你要根据自己的需求选择适合自己的可视化工具。
您可能也会对…感兴趣
原载于 2019 年 8 月 1 日【http://www.finereport.com】。
2019 年美国十大最成功的公司
Photo by rawpixel.com from Pexels
最近我碰到了Inc .2019 年美国最成功的 5000 家公司,这些公司实际上是根据 2015 年至 2018 年的收入增长百分比进行排名的。这是数据集能告诉我们的关于哪些州、行业和城市现在是最热门的。
对于那些想看实际的 5000 强名单的人来说,这里有完整的文章和对每个公司的简要描述。
让我们从排名前 10 的公司开始,包括他们的增长和收入以及位置。
Top 10 Ranking by Growth Percent
在按行业对 5000 强名单中的公司数量进行细分后,我们意识到硬件、IT 服务、环境服务和媒体在数据集中几乎没有代表性,因此它们位于图表的底部;另一方面,有趣的是看到零售在中间,实际上属于零售行业的最有趣的公司之一是 Chewy ,这是一个宠物产品(药物、食物、零食、用品)的在线平台,它始于 2011 年,到 2018 年已经实现了 35 亿美元的收入,增长了 736%。
Countplot of Number of Companies by Industry
到目前为止,赚钱最多的行业是健康公司;他们在 3 年内(2015 年至 2018 年)的收入接近 1600 亿美元。Inc 的数据集实际上有 5012 个值,而不是 5000 个值,其中健康仅占 7%,而商业产品&服务、广告&营销和软件公司占近 27%的值。即使在医疗行业与其他价值更高的行业竞争时,它的收入仍排在第一位。
Revenue by Industry
当我们查看公司在各州的分布时,我们可以看到加利福尼亚州、德克萨斯州和佛罗里达州的公司数量最多,排名前三,而波多黎各、密西西比州、佛蒙特州、罗德岛州和怀俄明州则排名垫底。这种高公司分布增加了各州的收入/增长,这就是前 3 个州与后 5 个州之间存在巨大差异的原因。
Revenue by State
Countplot of the Top Ten Cities
有趣的是,即使加州在行业数量(709 家公司)和收入(1930 亿美元)方面处于领先地位,纽约也是领先的城市,紧随其后的是芝加哥、亚特兰大、奥斯汀、休斯顿和达拉斯。
就行业增长率而言,软件实际上排名第一;软件公司发展非常迅速,我们可以看到,在旧金山、西雅图、纽约等城市,软件和在线服务公司不仅要专注于他们的主要优先事项,而且要准备好随着增长重新评估产品和流程,这一点很重要。我们可以在这个数据集中看到它的反映。尽管软件在总收入中排名第四,但它在增长图表中排名第一。
Growth Percent by Industry
Top 10 Billion Dollar Companies with their Ranking
5000 家(实际上是 5012 家)公司名单中有 4989 家公司的收入达到数百万美元,但有 23 家公司的收入达到数十亿美元。没有一家十亿美元的公司排在前 100 名,甚至没有排在前 500 名,这显然意味着收入本身不是上榜的最重要因素,而是时间和收入。十亿美元公司的平均“成立年龄”是 27 年(1992 年),而增长更快、排名更好的公司的“成立年龄”是 14 年(2005 年)。
与那些已经在市场上存在了相当长时间的公司相比,年轻的公司如果在短时间内赚了很多钱,就会有如此大的增长,这是有道理的,这些公司的价值逐年增加,但不是以指数方式,而是以线性方式增加。
Companies by Founded Year
结论:
虽然有些公司比其他公司赚得更多,但我们得出的结论是[时间+收入]是这里的重要因素;如果一个年轻的公司在短时间内赚了很多钱,那么排名就会上升。
除此之外,数据集在不同的收入、公司规模和增长方面有许多起伏,我们能够确定我们在开始这篇文章时想到的关键问题。
分析的三个主要问题是:
- 2019 年最热门的行业是哪个(根据数据集)。
- 哪个城市/州显示了最大的行业增长。
- 哪种类型的公司增长最快。
- 对于第一个问题,在按州和行业分解收入后,我们可以得出结论,目前最热门的投资行业是健康行业,除了价值低于软件和广告及营销行业外,它仍然排在这两个行业的前面。
- 就州而言,加利福尼亚州是公司最多的州,其次是德克萨斯州和佛罗里达州。即使加利福尼亚是交通最繁忙的州,纽约也是公司最多的城市。
- 软件公司发展非常快,我不认为这些类型的公司会很快停止增长,因为随着时间的推移,不同类型的行业似乎需要更多的软件“需求”。
数据科学的 10 大 Python 库
一段时间以来,Python 一直吸引着数据科学家。我与数据科学领域的资源、文献、课程、培训和人员的互动越多,精通 Python 的知识就成为一种很好的资产。话虽如此,当我开始提高我的 Python 技能时,我有一个必须了解的 Python 库列表。过了一会儿…
一段时间以来,Python 一直吸引着数据科学家。😀
数据科学领域的人肯定知道可以在数据科学中使用的 Python 库,但是当在采访中被要求说出它们的名称或陈述它的功能时,我们经常笨手笨脚,或者可能不记得超过 5 个库(这发生在我身上:/)
今天,我整理了 10 个 Python 库的列表,它们有助于数据科学及其外围领域,何时使用它们,它的重要特性和优势是什么。
在本文中,我根据自己最近的经验和探索,简要概述了对数据科学家和工程师最有用的 10 个 Python 库。阅读完整的故事,了解 4 个奖金库!
1.熊猫
Pandas 是一个开源的 Python 包,为 Python 编程语言中的标注数据提供了高性能、易于使用的数据结构和数据分析工具。熊猫代表 Python 数据分析库。谁知道呢?
什么时候用?Pandas 是一个完美的数据争论或管理工具。它设计用于快速简单的数据操作、读取、聚合和可视化。
熊猫获取 CSV 或 TSV 文件或 SQL 数据库中的数据,并创建一个包含行和列的 Python 对象,称为数据框。数据框非常类似于统计软件中的表格,比如 Excel 或 SPSS。
你能用熊猫做什么?
- 索引、操作、重命名、排序、合并数据帧
- 更新、添加、删除数据框中的列
- 估算丢失的文件,处理丢失的数据或变量
- 用直方图或箱线图绘制数据
这使得 Pandas 成为学习数据科学 Python 的基础库。
2.NumPy
Python 中最基本的包之一, NumPy 是一个通用的数组处理包。它提供了高性能的多维数组对象和工具来处理数组。NumPy 是通用多维数据的有效容器。
NumPy 的主要对象是同构多维数组。它是由相同数据类型的元素或数字组成的表,由正整数元组索引。在 NumPy 中,尺寸称为轴和轴的数量称为等级。NumPy 的数组类叫做 ndarray 又名 array。
什么时候用?NumPy 用于处理存储相同数据类型值的数组。NumPy 有助于数组的数学运算及其矢量化。这显著增强了性能,并相应地加快了执行时间。
你能用 NumPy 做什么?
- 基本数组操作:加法、乘法、切片、展平、整形、索引数组
- 高级阵列操作:堆叠阵列、分割成部分、广播阵列
- 使用日期时间或线性代数
- NumPy Python 中的基本切片和高级索引
3.SciPy
SciPy 库是构成 SciPy 栈的核心包之一。现在,SciPy Stack 和 SciPy 库是有区别的。SciPy 建立在 NumPy 数组对象的基础上,是包括 Matplotlib、Pandas 和 SymPy 等工具的堆栈的一部分,
SciPy 库包含高效数学例程的模块,如线性代数、插值、优化、积分和统计。SciPy 库的主要功能是建立在 NumPy 及其数组之上的。SciPy 大量使用了 NumPy。
什么时候用?SciPy 使用数组作为它的基本数据结构。它有各种模块来执行常见的科学编程任务,如线性代数、积分、微积分、常微分方程和信号处理。
4.Matplotlib
这无疑是我的最爱,也是一个典型的 Python 库。您可以使用 Matplotlib 可视化的数据创建故事。SciPy 堆栈中的另一个库 Matplotlib 绘制 2D 图形。
什么时候用?Matplotlib 是 Python 的绘图库,它提供了面向对象的 API,用于将绘图嵌入到应用程序中。它非常类似于嵌入在 Python 编程语言中的 MATLAB。
你能用 Matplotlib 做什么?
直方图,条形图,散点图,面积图到饼图,Matplotlib 可以描绘各种各样的可视化。借助 Matplotlib,只需一点努力和可视化功能,您就可以创建任何可视化效果:
- 线形图
- 散点图
- 面积图
- 条形图和直方图
- 饼图
- 树干图
- 等高线图
- 颤动图
- 光谱图
Matplotlib 还通过 Matplotlib 简化了标签、网格、图例和其他一些格式化实体。基本上能画的都画了!
5.海生的
所以当你阅读 Seaborn 上的官方文档时,它被定义为基于 Matplotlib 的数据可视化库,该库为绘制有吸引力和信息丰富的统计图形提供了高级接口。简单来说,seaborn 是 Matplotlib 的扩展,具有高级特性。
那么,Matplotlib 和 Seaborn 有什么区别呢?Matplotlib 用于基本绘图;条形图、饼图、线图、散点图等等,而 seaborn 提供了各种可视化模式,具有更简单的语法。
你能用 Seaborn 做什么?
- 确定多个变量之间的关系(相关性)
- 观察聚合统计的分类变量
- 分析单变量或双变量分布,并在不同的数据子集之间进行比较
- 绘制因变量的线性回归模型
- 提供高级抽象、多绘图网格
Seaborn 对于像 corrplot 和 ggplot 这样的可视化库来说是一个很好的二手工具。
6.Scikit 学习
Scikit Learn 是作为 Google 代码之夏项目向世界推出的,它是一个强大的 Python 机器学习库。它具有最大似然算法,如支持向量机,随机森林,k-均值聚类,谱聚类,均值漂移,交叉验证等…Scikit Learn 甚至支持 NumPy、SciPy 和相关的科学操作,Scikit Learn 是 SciPy 堆栈的一部分。
什么时候用?Scikit-learn 通过 Python 中的一致接口提供了一系列监督和非监督学习算法。像朴素贝叶斯这样的监督学习模型对 KMeans、Scikit learn 等未标记数据进行分组将是您的首选。
你能用 Scikit Learn 做什么?
- 分类:垃圾邮件检测、图像识别
- 聚类:药物反应,股票价格
- 回归:客户细分,分组实验结果
- 降维:可视化,提高效率
- 模型选择:通过参数调整提高精度
- 预处理:将输入数据准备为文本,以便用机器学习算法进行处理。
Scikit Learn 侧重于建模数据;不操纵数据。我们有 NumPy 和熊猫用于总结和操作。
7.张量流
回到 2017 年,我收到了一个 TensorFlow USB,作为对我在谷歌 WTM 活动上成为一名出色演讲者的感谢,哈哈。USB 装载了 TensorFlow 的官方文档。由于当时对张量流一无所知,我在谷歌上搜索了一下。
TensorFlow 是一个 AI 库,帮助开发人员使用数据流图创建具有许多层的大规模神经网络。TensorFlow 还促进了深度学习模型的建立,推动了 ML/AI 的最新发展,并允许轻松部署 ML 驱动的应用程序。
所有图书馆中最发达的网站之一是 TensorFlow。像 Google,可口可乐,Airbnb,Twitter,Intel,DeepMind 这样的巨头,大家都用 TensorFlow!
什么时候用?TensorFlow 在分类、感知、理解、发现、预测和创建数据方面非常高效。
TensorFlow 怎么办?
- 语音/声音识别—物联网、汽车、安全、UX/用户界面、电信
- 情绪分析—主要用于 CRM 或 CX
- 基于文本的应用程序—威胁检测、谷歌翻译、Gmail 智能回复
- 人脸识别——脸书的深度人脸、照片标签、智能解锁
- 时间序列—来自亚马逊、谷歌和网飞的推荐
- 视频检测—游戏、安全、机场中的运动检测、实时威胁检测
8.克拉斯
Keras 是 TensorFlow 的高级 API,用于构建和训练深度神经网络代码。它是 Python 中的一个开源神经网络库。有了 Keras,统计建模、处理图像和文本变得更加容易,简化了深度学习的编码。
Keras 和 TensorFlow 到底有什么区别?
Keras 是一个神经网络 Python 库,而 TensorFlow 是一个用于各种机器学习任务的开源库。TensorFlow 提供高级和低级 API,而 Keras 只提供高级 API。keras是为 Python 打造的,这使得它比 TensorFlow 更加用户友好、模块化和可组合。
你能用 Keras 做什么?
- 确定准确度百分比
- 计算损失函数
- 创建自定义功能层
- 内置数据和图像处理
- 用重复的代码块编写函数:20、50、100 层深
9.统计模型
当我第一次学习 R 时,进行统计测试和统计数据探索似乎是 R 中最容易的,并避免使用 Python 进行统计分析,直到我探索 Statsmodels 或 Python。
什么时候用?Statsmodels 是最终的 Python 包,它为描述性统计和统计模型的估计和推断提供了简单的计算。
如何处理 Statsmodels?
- 线性回归
- 相互关系
- 普通最小二乘(OLS)为经济学家在你!
- 生存分析
- 广义线性模型和贝叶斯模型
- 单变量和双变量分析,假设检验(基本上,R 能做什么!)
10.Plotly
Plotly 是一个典型的 Python 图形绘制库。用户可以导入、复制、粘贴或流式传输要分析和可视化的数据。Plotly 提供了一个沙盒 Python(你可以运行一个有能力限制的 Python ),现在我很难理解沙盒是什么,但我知道 Plotly 让它变得简单!?
什么时候用?如果您想要创建和显示图形,更新图形,悬停在文本上查看详细信息,您可以使用 Plotly。Plotly 还有一个额外的功能,就是把数据发送到云服务器。真有意思!
你能用 Plotly 做什么?
Plotly 图形库提供了大量可供绘制的图形:
- 基本图表: 折线图、饼图、散点图、气泡图、圆点图、甘特图、旭日图、树状图、散点图、填充面积图
- 统计和 Seaborn 风格 :误差、方框、直方图、面和格子图、树形图、小提琴图、趋势线
- 科学图表: 等高线、三元图、对数图、箭图、地毯图、雷达图、热图、风玫瑰图和极坐标图
- 财务图表
- 地图
- 支线剧情
- 转换
- Jupyter Widgets 交互
告诉过你,Plotly 是精华剧情库。想想可视化和 plotly 可以做到这一点!
现在是时候了,当我们探索了十大数据科学 Python 库的采访笔记指南,我们寻找我们的四个额外的库!
1.空间
SpaCy 是一个开源库,用于 Python 和 Cython 的高级 NLP(一种 Python 编程语言,使用 Python 代码提供类似 C 的感觉和性能,加上受 C 启发的语法)
2.散景
Bokeh 是一个 Python 库,我想称之为交互式数据可视化。有了 Tableau、QlikView 或 PowerBI 这样的工具,我们为什么还需要散景呢?首先,散景允许用简单的命令快速构建复杂的统计图表。它支持 HTML,笔记本或服务器输出。其次,可以将散景可视化集成到 Flask 和 Django 应用程序中,或者集成到 matplotlib、seaborn、ggplot 等其他库中编写的可视化中。
3.根西姆
我认为 Gensim 与我们目前所看到的有很大不同。它可以高效、轻松地从文档中自动抽取语义主题。Gensim 算法是无人监管的,这意味着不需要人工输入——只需要纯文本文档,然后就可以执行提取。
4.NLTK
NLTK(自然语言工具包)主要与人类语言而不是计算机语言一起工作,以应用自然语言处理(NLP)。它包含文本处理库,您可以使用这些库对数据执行标记化、解析、分类、词干分析、标记和语义推理。这听起来可能重复了这个库的功能,但是 Python 中的每个库都是为了提高效率而编写的。
这个故事到此为止。接下来…
数据科学 10 大算法!!
感谢您的阅读!如果您喜欢这篇文章,请点击拍手按钮,让我知道是什么库让您的数据科学之旅变得有趣。数据帐篷快乐!
了解你的作者
Rashi 是一名研究生,也是一名数据分析师、用户体验分析师和顾问、技术演讲者和博客作者!她渴望建立一个组织,将商界女性与资源海洋联系起来,让她们对工作和世界充满热情,无所畏惧。随时给她留言这里!