数据科学
Minder 建议引擎:
以下是如何使用随机森林进行数据分类的详细说明。
我们分析了由一个类似 Tinder 的配对网站产生的数据, Minder 面向一个特定的社区。其工作方式是,当您登录时,Minder 的引擎会根据您保存的偏好向您推荐配置文件。你可以向右滑动,即喜欢的个人资料,或者你可以向左滑动丢弃。任何显示过一次的个人资料,在任何情况下都不会再向您显示。因此,如果两个人互相喜欢对方,他们的详细资料会透露给对方。
为了增加匹配的可能性,我们显然需要了解人们的刷卡行为。我们收集了一百万条最新的刷卡数据,并决定使用由 Python 提供的流行生态系统来分析这些数据。我们用这一百万个数据点来训练我们的引擎。然后,我们的引擎预测一个人喜欢另一个人的可能性。
由于两种性别之间的性别行为非常不同(如下图所示),我们最终决定为男性和女性用户使用单独的预测分类器。
图表中的真和假值是候选人喜欢另一个还是不喜欢。我们可以看到,男性喜欢展示给他们的 58.65%的简介,而女性只喜欢 5.7%。这与男性相比甚至不到十分之一。
最终,我们实现了正确预测一个人是否会喜欢某个个人资料的结果,女性用户的准确率大约为 94%,男性用户的准确率为 83%。
详细信息分为以下三个部分:
I:使用机器学习的数据分类
首先,我们将大类分开,并确定根据性别和 T21 行为来分离数据可能是个好主意。我们决定使用由 Python 提供的流行生态系统来分析刷卡数据。我们的最终目标是创建一个 web 服务(RESTful ),通过提供两个用户的个人资料作为输入,提供一个人喜欢另一个人的大概情况。
导入库
我们将使用由 Pandas 库提供的数据帧来加载和操作数据。然后我们将使用 Matplotlib (及其衍生 Seaborn )库来可视化数据的不同方面。数字操作通常用 Numpy 数组完成,对于机器学习,我们使用 Scikit-Learn 。使用 pip 或任何其他合适的 Python 包管理器可以很容易地安装这些库。
import os
import datetime
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.externals import joblib
读取数据
我们已经对数据库中的所有数据进行了反规范化,并将其转储到一个平面 CSV 文件中。
data=pd.read_csv('1M.csv')
print data.shape data.head(2)----output----
(1000000, 27)
"p1_liked","p2_liked","confirmed","unmatched","answeredFromTelegram","p1_id","p1_country","p1_gender","p1_education","p1_flavor","p1_age","p1_timezone","p1_ethnicity","p1_languages","p1_religiosity","p1_premium","p2_id","p2_country","p2_gender","p2_education","p2_flavor","p2_age","p2_timezone","p2_ethnicity","p2_languages","p2_religiosity","p2_premium"
FALSE,,FALSE,,,151606,"US","male","graduate_degree","sunni",26,"-5","{""South Asian""}","{Bengali}","3.0661764705882355",FALSE,181761,"US","female","graduate_degree","sunni",26,"-4","{""South Asian""}","{Bengali,English,Hindi,Urdu}","2.9233774038461537",FALSE
FALSE,,FALSE,,,266475,"US","female","graduate_degree","sunni",26,"-4","{""South Asian""}","{Bengali}","1.5865208360015366",FALSE,213638,"US","male","graduate_degree",,,"-6",,,,FALSE
删除无用的列
当我们决定提取数据时,我们从数据库中收集了(几乎)所有可能用到的信息。后来我们决定删除几列,因为这些不是用户决策(刷卡)过程中使用的信息的一部分。
useless_columns = ['answeredFromTelegram', 'confirmed', 'p1_timezone', 'p2_timezone', 'unmatched'] data.drop(useless_columns, axis=1, inplace=True)
附:这些文章中使用的“风味”一词是指一个特定的宗教派别。
进一步反规格化数据
刷卡数据的结构是这样的,每个刷卡行都有一个名为[p1_liked]的字段,该字段包含第一个人(p1)的刷卡结果( true 表示 like ),第一个人(p1)被展示给另一个人(p2 的)的简档。当(且如果)p2 显示 p1 的配置文件时,使用相同的行,数据存储在名为[p2_liked]的字段中。如果两个字段都有真值,那么字段【确认】被设置为真值。请注意,我们之前已经删除了[确认]数据。
因为这些行(其中[p2_liked]不为空)包含两组数据,所以让我们复制它们,然后在切换[p1_…]和[p2_…]数据后将它们与主数据重新合并。这将使[p2_liked]无用,我们将删除它。
第一步是复制[p2_liked]不为空 T27 的行,即不是 T28 真 T29 就是 T30 假 T31。接下来,我们将交换其列的名称,以便交换 p1 和 p2 的角色。这对我们来说是一个新的数据点。
datap2=data[data.p2_liked>=0]
print datap2.shapep2_cols={'p1_age' : 'p2_age' , 'p1_country' : 'p2_country' ,
'p1_education' : 'p2_education' , 'p1_ethnicity' : 'p2_ethnicity' ,
'p1_flavor' : 'p2_flavor' , 'p1_gender' : 'p2_gender' ,
'p1_id' : 'p2_id' , 'p1_languages' : 'p2_languages' ,
'p1_liked' : 'p2_liked' , 'p1_premium' : 'p2_premium' ,
'p1_religiosity' : 'p2_religiosity' , 'p2_age' : 'p1_age' ,
'p2_country' : 'p1_country' , 'p2_education' : 'p1_education' ,
'p2_ethnicity' : 'p1_ethnicity' , 'p2_flavor' : 'p1_flavor' ,
'p2_gender' : 'p1_gender' , 'p2_id' : 'p1_id' ,
'p2_languages' : 'p1_languages' , 'p2_liked' : 'p1_liked' ,
'p2_premium' : 'p1_premium' , 'p2_religiosity' : 'p1_religiosity' }
datap2n= datap2.rename(columns=p2_cols)data2 = pd.concat([data, datap2n], axis=0);
print data2.shape
data2= data2.rename(columns={'p1_liked':'liked'})----output----
(43089, 22)
(1043089, 22)
我们看到数据中有 43089 行,其中两个人都刷了对方的个人资料。最后,我们将新数据帧与主数据合并,并将新数据帧称为 **data2。**我们也把[p1_liked]重命名为[liked]。[liked]列有 True/False 值,这些值就是我们的分类器将分类到的类。
根据性别分割数据
让我们在[p1_gender]的基础上分割数据。我们将很快证明我们的选择。
dataf = data2[(data2.p1_gender=='female') & (data2.p2_gender=='male')]
datam = data2[(data2.p1_gender=='male') & (data2.p2_gender=='female')]
print dataf.shape
print datam.shape----output----
(344951, 22)
(695762, 22)
让我们删除更多无用的列。记住我们不需要用户*id’*s 和性别值作为分类器。
useless_columns=['p1_gender','p2_gender','p2_liked','p1_id','p2_id']
datam.drop(useless_columns, axis=1, inplace=True)
dataf.drop(useless_columns, axis=1, inplace=True)----output----
count 1043089
unique 2
top False
freq 614942
Name: liked, dtype: object
行为分析
这里有一个根据性别分离数据集的基本原理。他们的行为完全不同。
dmvc = datam.liked.value_counts()
dfvc = dataf.liked.value_counts()
df = pd.DataFrame([dmvc,dfvc])
df.index = ['Males','Females']
df.plot(kind='bar', stacked=True);
男性喜欢向他们展示的 58.65%的简介,而女性只喜欢 5.7%。甚至不到十分之一相比男性。
dmm = datam.liked.mean()
dfm = dataf.liked.mean()
df = pd.DataFrame([dmm,dfm])
df.index = ['Males','Females']
df.plot(kind='bar', stacked=True);
print " True liked values - Males- {} ({:.2%})".format(datam.liked.sum(), datam.liked.mean())
print " True liked values - Females- {} ({:.2%})".format(dataf.liked.sum(), dataf.liked.mean())----output----
True liked values - Males- 408099 (58.65%)
True liked values - Females- 19791 (5.74%)
现在保存,让分析在单独的数据集上继续进行。
datam.to_csv("1M-datam.csv", index=False)
dataf.to_csv("1M-dataf.csv", index=False)
接下来:我们将分析女性用户的行为。
二:数据分析
让我们从加载 1M-dataf.csv 开始,这个文件包含了女性用户的滑动行为。我们假设已经加载了适当的库( Pandas、Matplotlib、Seaborn、Numpy、Scikit-Learn )。
加载数据
datafile='1M-dataf.csv'
data=pd.read_csv(datafile)
print data.shape
print list(data)
print data.liked.mean()
print data.liked.describe()----output----
(344951, 17)
['p1_age', 'p1_country', 'p1_education', 'p1_ethnicity', 'p1_sect', 'p1_languages', 'liked', 'p1_premium', 'p1_religiosity', 'p2_age', 'p2_country', 'p2_education', 'p2_ethnicity', 'p2_sect', 'p2_languages', 'p2_premium', 'p2_religiosity']
0.0573733660723
count 344951
unique 2
top False
freq 325160
Name: liked, dtype: object
正如我们从上一篇文章中所记得的,在[喜欢的]列中几乎 94.7%的值(355160/244951)都是错误的。
首先,我们向我们的数据框架添加一个新列[same_country]。如果国家相同或不同,添加信息,减少了我们的交叉类别很多。对于宗教派别来说也是如此。
data['same_country']=(data['p1_country']==data['p2_country'])
data['same_religion']=(data['p1_flavor']==data['p2_flavor'])
处理数字数据和相关的 N/A
print data.shape
data.describe().loc['count',:]----output----
(344951, 19)
p1_age 332184
p1_religiosity 257957
p2_age 328447
p2_religiosity 233237
计数值的差异是缺失值,或 NaN。我们将用中间值填充缺失的[年龄]值,用平均值填充缺失的[宗教信仰]值。
print (data.p1_religiosity.mean(), data.p1_religiosity.median(), data.p2_religiosity.mean(),
data.p2_religiosity.median())
print (data.p1_age.mean(), data.p1_age.median(),
data.p2_age.mean(), data.p2_age.median())
data.p1_age.fillna(data.p1_age.median(), inplace=True)
data.p2_age.fillna(data.p2_age.median(), inplace=True)
data.p1_religiosity.fillna(data.p1_religiosity.mean(),
inplace=True)
data.p2_religiosity.fillna(data.p2_religiosity.mean(),
inplace=True)----output----
(3.07051616485, 3.03669724771, 2.79660425283, 2.96941896024)
(26.1033403174, 25.0, 28.1010147756, 28.0)
分析开始
Seaborn 库提供了更简单的 API 来创建更好的可视化。
1。国家智慧
sns.countplot(x="p1_country", hue='liked', data=data);
让我们看一下标准化的数据,以便理解。
sns.barplot(x="p1_country", y='liked', hue='same_country',
data=data, ci=None);
按国家查看喜欢的个人资料。
因为就频率而言有三个不同的组:
- 美国
- CA/GB
- 世界其他地方
让我们分别来看。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.liked) & (data.p1_country=='US')],
ax=ax[0]);
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.like) & ((data.p1_country=='CA')|
(data.p1_country=='GB'))], ax=ax[1]);
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.liked) & (data.p1_country!='US')
&(data.p1_country!='CA') & (data.p1_country!='GB')],
ax=ax[2]);
fig.show()
所以国家分为四类
- 美国
- 加拿大
- 千兆字节
- 其他人
同样,我们将删除[p2_country]数据,保留[same_country],因为来自其他国家的数据点非常少,所以我们将它们分组在一起。我们将[p1_country]重命名为[country],并删除[p2_country]。
data.p1_country[(data.p1_country!='US') & (data.p1_country!='CA')
& (data.p1_country!='GB')]='XX'
data.rename(columns={"p1_country":"country"}, inplace=True)
data.drop("p2_country", inplace=True, axis=1)
绘制上面的图表表明,数据看起来仍然有意义。
fig, ax =plt.subplots(nrows=2, ncols=3, figsize=(15,10))
sns.countplot(x="country", hue='liked', data=data, ax=ax[0,0]);
sns.barplot(x="country", y='liked', hue='same_country', data=data, ci=None, ax=ax[0,1]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & (data.country=='US')], ax=ax[1, 0]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & ((data.country=='CA')|(data.country=='GB'))], ax=ax[1, 1]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & (data.country!='US') & (data.country!='CA') & (data.country!='GB')], ax=ax[1,2]);
fig.show()
2。宗教
宗教和教派信息无疑是目标群体中的一个关键因素。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_flavor", hue='liked', data=data, ax=ax[0]);
sns.barplot(x="p1_flavor", y='liked', data=data, ci=None, ax=ax[1]);
sns.barplot(x="p1_flavor", y='liked', hue='p2_flavor', data=data, ci=None, ax=ax[2]);
fig.show()
“其他人”很少,让我们把他们和“仅仅是穆斯林”合并起来,然后重复。
data.p1_flavor[(data.p1_flavor=='other')]='just_muslim'
data.p2_flavor[(data.p2_flavor=='other')]='just_muslim'
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_flavor", hue='liked', data=data, ax=ax[0]);
sns.barplot(x="p1_flavor", y='liked', data=data, ci=None, ax=ax[1]);
sns.barplot(x="p1_flavor", y='liked', hue='p2_flavor', data=data, ci=None, ax=ax[2]);
fig.show()
2.1 宗教狂热
宗教狂热呢?这是每个用户给出的关于他/她自己的信息,他/她有多虔诚,等级为 1-5。让我们先把数据转换成最接近的整数,然后画出来。
data=data.round({'p1_religiosity': 0, 'p2_religiosity': 0})
data.p1_religiosity=data.p1_religiosity.astype(int)
data.p2_religiosity=data.p2_religiosity.astype(int)
fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.barplot(x="p1_religiosity", y='liked', data=data, ci=None, ax=ax[0]);
sns.barplot(x="p1_religiosity", y='liked', hue='p2_religiosity', data=data, ci=None, ax=ax[1]);
fig.show()
所以看起来宗教相关性仍然比宗教告诉我们更多,但是宗教图表中的微小差异也可能帮助我们。两个都留着吧。
3。高级用户
fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.barplot(x='p1_premium', y='liked', hue='p2_premium',
data=data, ci=None, ax=ax[0]);
sns.barplot(x='p2_premium', y='liked', hue='p1_premium',
data=data, ci=None, ax=ax[1]);
fig.show()
高级用户更有可能被喜欢 **。**但这一点受到了怀疑,因为高级用户的个人资料更经常被展示。因此,让我们保留 p2 的保费数据,并在我们的培训中使用它来提高他们的概率,以便实际上不需要在最后计算保费。
p1 的先决条件也并非完全无关紧要。高级用户选择了更多的选择(右图)。但是这个事实并没有改善我们的预测。
4。教育
我们有一种预感,教育可能是一个关键因素。让我们验证一下直觉。但首先让我们打印我们的数据库中给出的独特的教育资格。
print data.p1_education.unique()array(['graduate_degree', 'college_degree', 'undergraduate', 'other',
'high_school', nan], dtype=object)fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
edu_o=['graduate_degree', 'undergraduate', 'college_degree', 'other', 'high_school']
sns.countplot(x="p1_education", data=data, order=edu_o, ax=ax[0]);
sns.barplot(x="p1_education", y='liked', hue='p2_education', data=data, ci=None, order=edu_o, hue_order=edu_o, ax=ax[1]);
fig.show()
所以教育似乎是影响决策的一个因素。既然反对这些的用户行为是相似的,让我们合并本科生,大学和其他。它们似乎同等重要。让我们称之为 BS。
data.p1_education[(data.p1_education=='college_degree')|(data.p1_education=='undergraduate')|(data.p1_education=='other')]='BS'
data.p2_education[(data.p2_education=='college_degree')|(data.p2_education=='undergraduate')|(data.p2_education=='other')]='BS'
为了确保万无一失,让我们绘制图表。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_education", data=data, ax=ax[0]);
sns.countplot(x="p1_education", data=data[data.liked], ax=ax[1]);
sns.barplot(x="p1_education", y='liked', hue='p2_education', data=data, ci=None, ax=ax[2]);
fig.show()
既然我们已经处理完了数据,是时候继续了。
处理列
关于我们将要使用的分类器(随机森林)的一点是,它可以很好地处理数字数据或虚拟分类数据(也称为指示变量)。现在我们有了所有的列(除了多值数组:[种族]和[语言]),让我们对它们进行适当的虚拟化和类型转换。
因为我们已经清理了数字字段(适当地填充了 NaN 值),所以让我们为训练/测试创建一个新的数据副本,称为 dt 。
dt = data[['p1_age','p2_age','p1_religiosity','p2_religiosity']].copy()
现在让我们为每个分类字段创建虚拟变量:[国家、教育、宗教(风味)、溢价]。
datac = pd.get_dummies(data.country, prefix="ct")
dt = pd.concat([dt,datac],axis=1)
dt = pd.concat([dt,data.same_country.astype(int)],axis=1)datae1 = pd.get_dummies(data.p1_education, prefix="edu1")
dt = pd.concat([dt,datae1],axis=1)
datae2 = pd.get_dummies(data.p2_education, prefix="edu2")
dt = pd.concat([dt,datae2],axis=1)datar = pd.get_dummies(data.p1_flavor, prefix="rel")
dt = pd.concat([dt,datar],axis=1)
dt = pd.concat([dt,data.same_religion.astype(int)],axis=1)dt = pd.concat([dt,data.p2_premium.astype(int)],axis=1)
我们已经完成了标准数据。有两个多值字段[种族、语言]。这些多值数据需要处理,因为我们将它们表示为 JSON 数组。我们将简单地使用我们对实际实现的理解来获得语言和种族列表。我们将遍历所有语言/种族,并进行子字符串比较,以查看我们的语言/种族是否在字段数据中。让我们创建一个新的数据框,并在那里进行一些分析。
首先针对语言:
langs=["Arabic", "Urdu", "Turkish", "Spanish", "Russian", "Pashtu", "Malaysian", "Italian", "Indonesian", "Hindi", "German", "French", "Filipino", "Farsi", "English", "Dutch", "Chinese", "Bengali"]dfl = pd.DataFrame()
dl1=data.p1_languages
dl2=data.p2_languagesdfl["liked"]=data.liked.astype(int)
dfl["same_language"]=0
for l in langs:
ln1="lang1_"+l
ln2="lang2_"+l
dfl[ln1]=(dl1.str.contains(l)==True)
dfl[ln2]=(dl2.str.contains(l)==True)dfl["same_language"]=dfl["same_language"]+((dfl[ln1])*(dfl[ln1]==dfl[ln2]))fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="same_language", data=dfl, ax=ax[0]);
sns.countplot(x="same_language", data=dfl[dfl.liked==1], ax=ax[1]);
sns.barplot(x="same_language", y='liked', data=dfl, ci=None, ax=ax[2]);
fig.show()
请注意,我们还为[same_language]创建了字段,这有望使分析变得更加简单。下一站【种族】。
dfe = pd.DataFrame()
de1=data.p2_ethnicity
de2=data.p2_ethnicitydfe["liked"]=data.liked.astype(int)
dfe["same_ethnicity"]=0
ethnics=["Afghan", "African American", "Arab (Khaleej)", "Arab (Levant)", "Arab (North Africa)", "Caucasian", "East African", "East Asian", "Hispanic", "Kurdish", "Persian", "South Asian", "Sub-Sahara African", "Turkish", "West African", "Other"]
for e in ethnics:
et1="ethn1_"+e
et2="ethn2_"+e
dfe[et1]=(de1.str.contains(e)==True)
dfe[et2]=(de2.str.contains(e)==True)
dfe["same_ethnicity"]=dfe["same_ethnicity"]+((dfe[et1])*(dfe[et1]==dfe[et2]))fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="same_ethnicity", data=dfe, ax=ax[0]);
sns.countplot(x="same_ethnicity", data=dfe[dfe.liked==1], ax=ax[1]);
sns.barplot(x="same_ethnicity", y='liked', data=dfe, ci=None, ax=ax[2]);
fig.show()
请注意,图表显示了喜欢的简介的匹配语言/声明种族的频率。让我们最后把这个数据加到 dt 上。我们还需要将目标列 *liked、*添加到 dt 中,然后将数据帧保存到一个文件中。
dt = pd.concat([dt,dfl.same_language.astype(int)],axis=1)
dt = pd.concat([dt,dfe.same_ethnicity.astype(int)],axis=1)
dt = pd.concat([dt,data.liked.astype(int)],axis=1)
print dt.shape
dt.to_csv("dataf-categorical.csv", index=False)----output----
(344951, 23)
在填充缺失值、创建虚拟(指示)变量和减少字段数量(维度缩减)之后,我们可以看到我们的数据由 23 个属性组成。在下一步中,我们将训练我们的分类器,看看我们的进展如何。
三:培训/储蓄和测试
我们将使用随机森林分类器,众所周知它在这类问题中工作得很好。同样,我们假设已经加载了适当的库( Pandas、Matplotlib、Seaborn、Numpy、Scikit-Learn )。
让我们加载数据,并提醒自己所涉及的维度。
datafile="1M-dataf-categorical"
data=pd.read_csv(datafile+".csv")
print data.shape
print ("Percentage of likes: {:.2%}".format(data.liked.mean()))----output----
(344951, 23)
Percentage of likes: 5.74%
我们有 345K 的刷记录,只有 5.74%的喜欢,其余都是不喜欢。
创建训练和测试数据集
让我们将数据分为训练数据和测试数据。我们将在每个集合中随机放置一半数量的行。
num_test = 0.5
train, test, train_target, test_target =
train_test_split(data.drop(['liked'], axis=1),
data.liked, test_size=num_test, random_state=23)
train_features = train.values
test_features = test.valuesprint "Training Data (rows, columns): {}".format(str(train_features.shape))
print "Testing Data (rows, columns): {}".format(str(test_features.shape))----output----
Training Data (rows, columns): (172475, 22)
Testing Data (rows, columns): (172476, 22)
字段[liked]已从特征数据中分离出来,并将用作训练和测试的目标类数据。
训练并保存随机森林模型
clfr = RandomForestClassifier(max_depth = 35, min_samples_split=2, n_estimators = 20, random_state = 2)start = time.time()
model = clfr.fit(train_features,train_target)
end = time.time()print("Training Time: {:.2f} seconds.".format(end - start))
print("Classifier Score: {:.2%}".format(model.score(train_features,train_target)))
joblib.dump(model, datafile+'-RFclf.pkl');
注意: clfr 是我们用一些适当的参数初始化的主 classier 对象。 fit 函数是核心训练函数,所以我们对它进行计时,以便对在我的 core-i3 linux 机器上训练大数据所需的时间进行估计。我们将分类器的准确性打印在训练数据上。记住极高的训练效率最有可能导致过拟合的问题。我们的模型使用 SK-Learm 中的 joblib 模块保存在 pkl 文件中,并且可以重复使用。
----output----
Training Time: 6.31 seconds.
Classifier Score: 97.31%
这似乎令人印象深刻。所以现在我们当然可以原样使用模型,但是仅仅为了好玩,我们将重新加载模型。
重新加载模型并根据测试数据预测结果
clf = joblib.load(datafile+'-RFclf.pkl')
pred = clf.predict(test_features)
print("Accuracy: {:.2%}".format((test_target.values==pred).mean())----output----
Accuracy: 93.34%
请注意,我们可能使用了
clf.score(test_features,test_target)
这是由 sk-learn 提供的功能,但是为了准确起见,我们使用了简单的比较计数。结果会是一样的。
所以现在这是一个很好的结果,但是通过预测每一个配置文件匹配为假,它可能很容易方便地(但显然是无用地)增加,因为它们中的 95 %应该是假的,我们将获得 95%的准确性,没有假阴性。但是输出对我们没有任何帮助。对于 95%的简档,我们可以通过随机预测不喜欢的达到 90%以上的准确率。对于“有用”的结果,我们需要通过使用所谓的混淆矩阵来分析行为。
confusion_matrix(test_target,pred)----output----
array([[160001, 2554],
[ 8929, 992]])
但这并没有给我们太多的洞察力,相反,让我们自己重新计算这些值,以了解发生了什么。
aq1=(test_target.values==pred) & (test_target.values==0)
aq2=(test_target.values!=pred) & (test_target.values==0)
aq3=(test_target.values!=pred) & (test_target.values==1)
aq4=(test_target.values==pred) & (test_target.values==1)
print " True Negative {} ({:.2%})".format(aq1.sum(), aq1.mean())
print "False Positive {} ({:.2%})".format(aq2.sum(), aq2.mean())
print "False Negative {} ({:.2%})".format(aq3.sum(), aq3.mean())
print " True Positive {} ({:.2%})".format(aq4.sum(), aq4.mean())----output----
True Negative 160001 (92.77%)
False Positive 2554 (1.48%)
False Negative 8929 (5.18%)
True Positive 992 (0.58%)
这是首次尝试。接下来,我们当然可以玩我们削减的参数(在第二部分)以及设计新功能。由于喜欢的比例已经很低,我们可能得不到足够的匹配。为了理解这一点,考虑一下预测函数是如何工作的。分类器给出一个数据点(输入行)属于某一类的可能性(概率)。如果喜欢(比如 0.6)的概率高于不喜欢 (0.4),那么预测将为真,否则为假。因此,即使我们的分类器预测到不像,它也可能是 100%到 0%的决定,而不是 51%到 49%的决定。对于后一种情况,最好将其作为可能的候选返回,因为可能的简档的数量已经非常少了。
幸运的是,预测结果可以作为类别概率而不是类别值来检索(在我们的例子中是真/假)。
print clf.predict_proba(test_features)----output----
array([[ 1\. , 0\. ],
[ 1\. , 0\. ],
[ 0.44, 0.56],
...,
[ 1\. , 0\. ],
[ 0.98, 0.02],
[ 1\. , 0\. ]])
返回的数组维数为 172476✕2.针对每一行,我们得到两个概率值,分别针对不像和像。我们可以对这个数组进行排序,并使用最好的几个结果来建议候选项。
对男性用户的数据进行同样的处理,最终达到 83%的准确率。
原载@ 努曼的博客2017 年 7 月 31 日
数据科学:成为数据科学家的 5 项技能
Photo by William Iven on Unsplash
不管你目前是否是一名数据科学家,如果你有学习新技能的冲动,总有机会成为一名数据科学家。许多年轻的 IT 人员甚至经验丰富的经理经常问我他们成为数据科学家的各种途径。几天前,我在创建一份工作描述,并在想…嗯…我应该雇用哪种数据科学家?
牢记这一点,我想在这里写下我的想法,给任何渴望成为数据科学家或寻求职业改变的人。因此,我在这里列出了我希望公司聘用的数据科学家具备的 5 项最重要的技能。
- 编程技巧
我强烈推荐的一件事是精通一种编程语言,它可以是 R、Python 或 Julia。但至少要擅长其中一项。随着数据科学中无数产品的出现,我看到了我称之为 GUI 一代的大军。我相信编程打开了你大脑的逻辑部分,这也是我感兴趣的。做数据科学家要有逻辑。
2.数学—统计&线性代数
主要是为了了解各种统计模型的“黑箱”背后发生了什么。你可能会说 Python 和 R 中有许多现成的库,你可以使用它们。然而,理解模型如何工作以及如何调整每个模型的变量以获得期望的精度是非常重要的。良好的统计和线性代数知识将是你的数据科学技能库的一个很好的补充。
3。机器学习
如果你将成为一名数据科学家,100%肯定你应该对机器学习技术和算法有很好的理解,如 KNN、朴素贝叶斯、SVM、决策树、逻辑回归等。您应该很好地了解如何使用 Python 和 R 的库来实现这些模型。拥有机器学习模型和工作流的操作化经验对于在生产中成功部署模型非常重要。尽管如此,您也应该对使用像 Numpy、Plotly、Pandas、Seaborn 等工具包有很好的理解。
4。通信
我强烈建议寻找一名数据科学家,他应该有开放的思维,渴望学习和进步新的和即将到来的技能。一个乐于自信地承担责任并带来新想法的人,这有助于改善数据平台和利用数据实现商业价值。数据科学家拥有通过数据“讲故事”的能力,将数学结果转化为可操作的见解或干预措施,这一点非常重要。处于业务、技术和数据的交汇点,个人应该具备用业务语言向每个利益相关者讲述数据科学故事的技能。可以通过使用 Tableau 等 BI 工具或使用 Python 或 R 可视化框架(如 Dash 或 Shiny)来直观地讲述一个故事。
5。数据驱动的思维模式
我强烈倾向于雇佣一个数据驱动的问题解决者。我强烈建议一个有抱负的数据科学家培养数据争论和探索的技能。学习更多关于数据架构和数据建模的基础知识以及数据库平台的动态将是一个很好的补充。扎实的 SQL 知识对数据分析和探索非常有帮助。对于数据科学家来说,拥有构建机器学习模型的领域知识非常重要。因此,努力学习更多关于业务如何运作以及哪些因素影响业务和客户行为的知识。
除了上述主要技能,我强烈建议有抱负的数据科学家使用各种开放数据平台上可用的数据集来构建他们的项目组合。在 Kaggle 上参加数据科学竞赛,因为你开始解决各种问题,这些问题可以帮助你建立数据科学领域的技能。但是你需要具备的最重要的技能是逻辑思维和思想开放。
成为一名数据科学家不仅仅是能够编写代码,还需要了解业务领域,并对数据有一个非常开放和逻辑的观点。成为一名优秀的数据科学家需要大量的探索、实践和耐心,我能给你的最后一个建议是不要落入互联网上声称能让你在几天内成为优秀数据科学家的资源陷阱。
数据科学:个人应用
记录 2017 年的重量挑战
我经常从学习数据科学的人那里听到的一个挫折是,很难从书本上的玩具示例跳到现实世界的问题。任何学习过程都必须从简单的问题开始,但在某些时候,我们需要超越精选的例子,进入杂乱的、人为生成的数据。这张图很好地总结了我在数据科学教育中所经历的事情,尽管我还没有翻过这座诅咒之山,但我已经通过尝试(并且经常失败)大量使用真实数据的项目爬上了一部分:
Technology Learning Curve (Source)
爬上这条曲线的最好方法是随着时间的推移建立你的信心,没有比一个与你的生活直接相关的项目更好的起点了。这篇文章将展示数据科学对我和我父亲健康的直接应用,一个有明显好处的个人问题,如果曾经有过的话!
好消息是,为了将数据科学应用于个人利益,你不需要大型科技公司的数据或资源,只需要一套一致的测量方法和免费的开源分析工具,如 R 和 Python。如果你停下来看看,你会发现你周围都是等待被跟踪的数据流。你可能每天早上都站在磅秤上,根据结果,祝贺或贬低自己,然后第二天再忘记。然而,花几秒钟时间,在电子表格中记录每天一次的体重,可以在几个月后产生一个有用而干净的数据集(,增加你达到目标的几率)。这些数据非常适合让您在实际问题上发展您的数据科学技能。
就其核心而言,数据科学从根本上讲是从数据中提取智能,这篇文章展示了数据科学如何产生改善现实世界结果的见解。数据科学是一个多学科领域,由计算机科学、统计学和工程学组成,但最重要的方面也是最容易被忽视的方面:通信。你的分析可能很棒,但归根结底,经理、教授和公众更关心最终结果,而不是确切的方法。能够清楚地传达数据科学问题的答案和分析的局限性是任何数据科学工具箱中的宝贵资产。
在这篇文章中,我省略了所有用于创建图表的代码(在 R 中完成),以便专注于结果以及我们可以从它们中学到什么,但是所有代码都可以在 project GitHub 页面上找到,以便任何想要了解神奇是如何发生的人使用。同样,这些数据在 GitHub 和 Google Drive 上以一个 csv 文件的形式提供给那些想跟进的人。我还试图为那些想了解更多的人提供特定主题的资源。现在,是时候深入了解 2017 年大体重挑战的数据科学了!
**免责声明:**首先,本项目呈现的所有数据都是真实的!我爸爸和我都相信开放数据(在一定程度上),我们绝对不在乎让自己看起来比实际上更成功。第二,我不会试图向你推销任何减肥产品(尽管我确实考虑过把这篇文章叫做“如何用数据科学减肥”)。
2017 年的重量大挑战
多年来,我和父亲一直善意地互相取笑我们各自的挣扎——我的是增加体重,他的是减轻体重——我和父亲决定最好的解决办法是体重变化比赛。我父亲的表现将以体重减轻来衡量,而我的则以体重增加来衡量。唯一的规则是:我们必须每天称重一次,比赛从 8 月 18 日开始,到 2018 年 1 月 1 日结束,输的人必须向赢的人支付赢的人体重变化的两倍,以磅为单位。因为这是一个现实世界中的问题,第一条和第二条规则都不完全成立!尽管如此,在比赛过程中(实际上在 1 月 6 日结束),我们每个人都收集了超过 100 个数据点,足以得出许多有趣的结论。
竞争对手
- 我(威尔):大学年龄,男性,5 英尺 11 英寸,起始体重 125.6 磅,学生,偶尔跑超级马拉松
- 爸爸(克雷格):壮年男性(我让你猜猜是多少岁),5 英尺 11 英寸,起始体重 235.2 磅,办公室职员,前竞技举重运动员
我们都决定尽可能开诚布公地面对挑战,并告诉家人和朋友关于比赛的事情,以迫使我们坚持到底。在收到大量善意的建议后,我们制定了各自的策略。我决定开始吃午餐,因为我已经养成了不吃午餐的不健康习惯,以便专注于我在美国宇航局的实习工作。我爸爸想吃完全相同的饮食,但减少份量。这似乎是一个明智的决定,因为这意味着他不必考虑节食,而是做同样的食物,用更小的盘子盛着。他还决定通过长距离散步进行锻炼,强调不需要短期减肥计划,而是需要更健康的整体生活方式。
结果
不妨从整个结果图开始。
Weight Challenge Results
就这样,对吗?整个比赛总结成一幅画。嗯,不完全是。这是一个好的开始,但从我们对数据的研究中还可以获得很多真知灼见。通过数据绘制的线是使用“黄土”回归方法制作的模型,而点是实际测量值。马上我们可以看到我们两个都走在正确的方向上!然而,这个图表掩盖了很多信息。我们甚至无法判断谁赢了!为此,我们可以用图表显示我们的体重从起始体重开始的变化,单位是磅。
Absolute Weight Change
我们在这里使用绝对值,所以数字越大越好。我们可以清楚地看到,虽然比赛一开始很接近,但我的父亲(克雷格)在最后拉开了距离,并以相当大的优势获胜。恭喜爸爸!另一个问题是体重测量非常嘈杂。我们尝试每天在相同的时间,早上第一件事,在相同的规模上采集数据,但是每天影响体重的因素太多以至于只看一个点毫无意义。只有通过检查一系列数据点,趋势才会出现。此外,我们体重的每次变化似乎都类似于平方根关系或对数。也就是说,有一个最初的快速增益(或损失),然后随着时间的推移变得平稳。这是意料之中的,因为最初当你有动力的时候,很容易取得进步,但是保持这种动力是很困难的。最终,我们都进入了体重平台期,最后的测量显示出轻微的改善迹象,这可能是也可能不是趋势。
这个结果的一个小问题是它没有考虑体重。如果我爸爸减掉 10 磅,相对于他的体重来说,比我增加 10 磅要小。下一张图也显示了变化,但这次是根据体重的百分比。
Weight Change Percentage
好吧,如果你支持我,这张图看起来会好得多。在比赛的大部分时间里,我的百分比变化都比较大,我一直领先,直到最后一天,我爸爸在百分比上略微超过了我。有趣的是,我们两个都适应了接近 6%的体重变化。这可能意味着我们的身体很容易在±6%的范围内波动,但除此之外,进一步的变化就更加困难了。
以下是最终的数值结果。
- 克雷格:最终重量= 219.8 磅,绝对变化= 15.4 磅,百分比变化= 6.55%
- 将:最终重量= 134 磅,绝对变化= 7.4 磅,百分比变化= 5.85%
建模
图表可以向我们展示大量信息和快速的定性趋势,但不能用定量结果来回答问题。例如,我们每个人平均每天增加或减少多少体重?用所有的数据预测一年后我们的体重是多少?这些都是我们必须求助于造型来回答的问题。
简单线性建模
对于任何有连续变量(如重量)的建模,最好的起点是简单的线性回归方法。我们将创建一个带有一个响应变量(y)和一个解释变量(x)的线性模型。我们对体重和比赛开始后的天数之间的关系感兴趣,因此,答案是体重,解释变量是天数。从图表中,我们看到这可能不是数据的最佳表示,但这是一个很好的起点,可以让我们量化各自的体重变化。
Craig 的模型结果如下所示。这里有很多信息,但我会浏览一遍并指出哪些是重要的。
Coefficients:
Estimate Std. Error t value Pr(>|t|)
**(Intercept) 227.779544** 0.481849 472.720 < 2e-16 ***
**days -0.023887 ** 0.006326 -3.776 **0.000264 *****
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 3.861 on 105 degrees of freedom
**Multiple R-squared: 0.1196**, Adjusted R-squared: 0.1112
F-statistic: 14.26 on 1 and 105 DF, **p-value: 0.0002642**
要检查的主要部分是参数,即定义模型的数字。在简单线性模型的情况下,这些是截距和斜率,如直线方程所示:y = mx + b。对于体重挑战,该模型为:体重=(每天体重变化)*天数+零天体重。上述总结中第 0 天的重量在估算栏下的(截距)行中,值为 227.78 磅。每天的重量变化在“估计”列下的“天数”行中,值为-0.024 磅/天。这意味着,在线性模型下,我爸爸平均每天减掉 0.024 磅。
上面介绍的其他统计数据稍微详细一些,但也很有信息。 R 平方表示y 变量(重量)的变化分数,可以用 x 变量(天数)的变化来解释。更高的 R 平方意味着模型更好地代表了数据,我们可以看到我们的模型只占重量变化的 11.96%。此外,我们可以查看 p 值,看看我们的模型中是否有真正的趋势,或者我们的数据是否只是噪声。p 值是一种常见的统计数据,表示在模型下观察到的数据随机出现的概率。对于 Craig 的模型,p 值为 0.0002642,远低于公认的显著性阈值 0.05(p 值越低越好,因为这意味着数据不太可能是偶然生成的)。所以,我爸减肥单纯是随机噪音的几率不到万分之三。从这个模型中,我们可以得出结论,我爸爸在比赛过程中的体重下降是一个真正的趋势!
我们现在可以转向我的简单线性回归模型进行类似的分析。
Estimate Std. Error t value Pr(>|t|)
**(Intercept) 131.9** 3.133e-01 420.843 <2e-16 ***
**days 0.0095** 3.808e-03 2.388 0.0185 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 2.679 on 121 degrees of freedom
**Multiple R-squared: 0.04502,** Adjusted R-squared: 0.03713
F-statistic: 5.704 on 1 and 121 DF, **p-value: 0.01847**
模型摘要显示截距为 131.9 磅,每日重量变化为 0.0095 磅,R 平方为 0.04502,p 值为 0.01847。我们的结论是:
- 在比赛过程中,我每天增重 0.0095 磅
- 这个模型只能解释重量变化的 4.5%
- 由于纯粹的偶然性,观察到的结果有 1.85%的几率发生
我的模型的 p 值略高于我爸爸的,但它仍然低于显著性阈值,并且模型显示了真实的趋势。
我们可以通过稍微修改完整的结果代码并将模型趋势线从“黄土”改为线性,来直观显示线性模型与数据的拟合程度。
Linear Model Performance
从线性模型中得到的启示是,我父亲和我都在挑战中向我们的体重变化目标展示了显著的进步。
广义加性模型
广义相加模型超越了简单线性模型的线性关系假设,将时间序列(在这种情况下为权重)表示为总体趋势以及日、周或年模式的组合(相加)。这种方法非常适用于经常展示特定模式的真实世界数据。我们的数据在大约 4 个月的时间里每天收集一次,所以只有周模式和总体趋势(要获得日模式需要每天进行多次观察)。尽管如此,我们仍然能够从加法模型中得出有用的结论。
我们可以先画出总体趋势。这类似于我们在完整结果图中看到的平滑线,向我们展示了体重变化的总体轨迹。
Overall Trend from Generalized Additive Model
下一张图显示了一周内每天体重增加或减少的趋势。该图提供了可操作的信息,因为它显示了哪些日子对我们的体重变化目标有问题。
Weekly Trends
虽然我爸爸和我试图去相反的方向,我们有非常相似的每周模式。在工作周的前两天,我们的体重都下降了,在工作周的其余时间体重增加了,并在周末呈下降趋势。有可能对此有太多的解读,但我自己的解释是,我倾向于在周末进行更多的锻炼(通常是几个小时的跑步),这将减少我进入工作周的体重。然后,当我忙于上课时,我会恢复体重,直到周末再次失去动力。我爸爸在周末表现更好,可能也是因为他不工作时锻炼增加了。这些结果表明,我需要努力在周末消耗更多的食物,而我的父亲需要努力减少他在一周内的消耗量。一个广义的加法模型可能看起来很复杂,但是我们可以使用结果来确定简单的行动来改善我们的健康!
预言
建模的另一个好处是,我们可以使用结果进行预测。我们可以使用线性模型或广义加性模型进行预测,但是因为加性模型更好地代表了数据,所以我们将只使用它进行预测。有两个主要关注的估计值:
- 对 2018 年 1 月 1 日的预测是根据我们前两个月(到 2017 年 10 月底)的测量结果做出的
- 对 2019 年 1 月 1 日的预测是通过所有测量得出的
第一个预测将使我们能够将我们在下半年的表现与基于上半年数据预测的表现进行比较。第二个预测会让我们知道一年后我们会在哪里。
预测的一个经常被忽视的重要方面是不确定性界限。经理们通常只想要一个单一的预测数字,但在一个不确定的世界里这是不可能的。即使是最精确的模型也无法捕捉数据中固有的随机性或不精确的测量设备。因此,为了成为负责任的数据科学家,除了单一的预测数字,我们还将提供一系列的不确定性。
根据两个月的数据对 2018 年 1 月 1 日的预测
下图显示了克雷格和我根据截至 2017 年 11 月 1 日的数据对比赛计划结束时间的预测。
Craig Prediction for Jan 1, 2018
Will Prediction for Jan 1, 2018
灰色阴影区域表示预测中最重要的部分:不确定区域。红线向我们展示了最有可能的未来结果,如果我们继续目前观察到的趋势。阴影区域是基于观察并考虑测量中的噪声的最终重量的可能范围。要正确看待这些范围,我们应该看看实际数字:
- 克雷格:预测= 213.2 磅,上限= 223.5 磅,下限= 203.2 磅,1 月 1 日的实际体重= 220.8 磅
- 威尔:预测= 135.6,上限= 143.4 磅,下限= 127.3 磅,1 月 1 日实际体重= 136.9 磅
我和爸爸的实际体重都在预测范围内。该模型在预测我们两个月前的实际体重方面做得相对较好,考虑到它正在处理大约 70 个数据点!
2019 年 1 月 1 日的预测
作为对模型的最后探索,我们可以看看从现在起一年后我们会达到什么程度。也许这些预测不会完全实现,但它们至少应该给我们明年一个目标!以下是利用所有比赛数据对 2019 年做出的预测:
Craig Prediction for Jan 1, 2019
Will Prediction for Jan 1, 2019
这些图表清楚地显示了我们从数据中推断的不确定性是如何增加的。按照这些情节,明年初我可能比我爸还重!这个练习更多的是为了好玩,而不是作为一个严肃的预测,但是如果我们继续收集更多的数据,预测可以改进。最终,有了足够的信息,我们应该能够建立一个模型,从理论上对未来一年做出准确的预测。我们将不得不在明年检查这些预测的准确性的更新!
- 克雷格:预测= 208.8 磅,上限= 230.9 磅,下限= 186.0 磅,目标体重= 215.0 磅
- 意志:预测= 147.2 磅,上限= 209.2 磅,下限= 85.5 磅,目标体重= 155.0 磅
结论
在任何数据分析结束时,你要问自己的问题是:“我现在知道哪些我可以使用的东西?”有时候答案会是不多,这是非常好的!这只是表明您需要收集更多的数据,或者您需要重新考虑建模方法。但在 2017 年大重量挑战的分析中,有一些见解需要复习并投入使用!
- 克雷格在体重变化方面轻松赢得了比赛,尽管我们都很成功:克雷格减掉了约 6%的体重,而我增加了约 6%。
- 克雷格每天减了 0.024 磅,而我每天增加了 0.0095 磅。我们俩都表现出体重变化的显著趋势。
- 我需要在周末努力增加体重,而我爸爸需要在工作日努力减肥。
- 在比赛的前半段,当体重变化始终朝着正确的方向发展时,我们两人都表现得更好,但在第三个月我们达到了平台期。
- 对明年的预测表明,我们双方都将继续走在正确的道路上,但存在相当大的不确定性。
最后,我将展示另外两个图表,对比 2018 年 1 月 1 日的预测与这一天的实际结果。
Craig Additive Model Prediction vs. Actual Weight
Will Additive Model Prediction vs. Actual Weight
我希望这篇文章展示了任何人如何在日常生活中使用数据科学为个人或社区造福。我的目标是让数据科学民主化,让每个人都能通过展示数据科学工具的真实用途来利用这个令人兴奋的领域!
一如既往,我欢迎反馈和建设性的批评。可以在 wjk68@case.edu 找到我。
棒球数据科学,第 1 部分:击球手
将无监督学习技术应用于棒球的现代击球手
当我在回忆如何应用各种机器学习技术时,我发现自己在想它们可能会从另一组数据中揭示什么。当然,棒球比其他运动有更丰富的数据可以利用,部分原因是这些统计数据被记录了 100 多年。因此,我开始研究一些数据(可以通过 https://github.com/chadwickbureau/baseballdatabank 的从查德威克棒球局获得)。
首先,我从 1969 年至今的赛季(大致相当于黄金时代的结束)中提取了击球数据集的子集,并剔除了总共打了不到 600 场比赛的球员,以确保每个球员都有相当数量的数据可以利用。接下来,我汇总了单个玩家的统计数据,这样每行数据代表一个玩家。因为许多计数统计(HR、SB 等。)是非正态分布和右偏的,我通过跨赛季取每个测量值的中间值(而不是平均值,后者更容易受到离群值的影响)来近似每个球员的“标准”赛季。然后,我对 fielding 数据集进行了相同的聚合,并将其附加到 hitting 数据帧,以形成一个统一的数据集。
最初,我的想法是选取一些最具预测性和正交性的指标(比如,本垒打、上垒率、盗垒率和双杀率),并将这些指标作为聚类的基础。然而,在经历了几次这一过程后,我意识到有一个更简单(也许在统计学上更合理)的方法来确定最能区分击球手的因素:主成分分析。因此,我首先对数据集运行主成分(PC)分析,然后对前 6 个成分(其特征值> 1)的 PC 负载运行高斯混合模型,以将玩家聚类到不同的类别。高斯混合模型反复比较了多个可能分组的信息内容(我选择了 4 到 7 个类别),最终在数据集中找到了 6 个类别(玩家的集群):
Scatter plots of each player’s loading on the first 6 principal components (PC), colored by class identity as determined by a gaussian mixture model.
Loadings on each Principal Component for the six classes identified by GMM
尽管每个部分都有很高程度的重叠,但 GMM 似乎找到了与六个不同类别的玩家相对应的相当分离的集群。当然,主成分并不总是容易解释的:再说一遍,PC6 到底是用来衡量什么的?因此,为了调查这六个职业在棒球能力方面可能大致对应的情况,我没有在逐个球员的基础上检查个人电脑,而是回到了最初的统计数据。
首先,我查看了这六个类别中的每一个如何符合高斯混合模型所使用的每一个统计数据的摘要:
Mean values for each batting (AB through SLG) and fielding (PO through DP) statistic for each class (leftmost column).
这六个等级可能代表什么肯定有一些暗示,特别是考虑到在诸如本垒打(HR)、盗垒(SB)、在垒率(OBP)、击球率(SLG)和所有四种防守措施(出局数、助攻数、失误数和双杀数)上的明显差异。如果你把这些职业和球员的位置交叉列表,这些职业之间的差异会更加明显:
Counts of each position (rows) observed within each class (columns).
三垒手几乎完全属于一级,二级全是一垒手,几乎所有的接球手都在三级,四级全是二垒手和游击手,五级和六级主要是外野手。结合在每个类别中观察到的汇总统计数据,该数据有助于将六个类别解释如下(在每个标题下确定了最有可能属于该类别的五名玩家):
1 级—电力内场
迪安·帕尔默、迈克·施密特、佩德罗·阿尔瓦雷斯、特洛伊·格莱斯、乔希·唐纳森
路中间。倾向于打出像样的力量,他们相当灵活,但速度不够快,无法三连击或巡视外场的更深范围。
第 2 类—第一基本图例
威利·乌普肖,基思·埃尔南德斯,杰夫·巴格韦尔,乔治·斯科特,乔伊·沃托
他们不仅在角落里做得很好,而且比其他任何群体走得都多,就好像他们无法抗拒他们位置的吸引力。
3 级—缓慢而稳定
AJ Pierzynski,Carlos Ruiz,Jason Varitek,Matt Wieters,Joe Mauer
几乎每一个捕手都属于这一类,由于结合了低速度、良好的力量和持续的防守。他们最大的弱点?他们不太可能一路跑到得分最少的垒。
第 4 类—内场向导
唐·凯辛格、埃尔维斯·安德鲁斯、蒂托·富恩特斯、奥兹·史密斯、霍勒斯·克拉克
巨大的助攻和转身双杀(在一个几乎完全由 2B 和 SS 组成的团队中是可以预期的),他们也相当快地上垒,尽管他们的击球还有待改进(最低的 OBP 和 SLG)。
第 5 类——速度恶魔
迪·戈登、乔内·费金斯、胡安·塞缪尔、文斯·科尔曼、胡安·皮埃尔
投手们讨厌盯着的家伙们,这个最小的小组由一些有史以来最快的球员组成。正如你所料,他们不打太多力量球,但是他们有能力打出一垒安打和三垒安打,击败双杀,这意味着他们能得很多分。
6 级——强力外场手
斯塔林·玛特、迈克·特劳特、达里尔·草莓、卡洛斯·戈麦斯、格雷迪·西斯摩尔
打击,速度,力量:这是一个可以做到一切的群体,也是最有可能让你进入名人堂的群体。
最后,我深入到各个数据点,看看无监督类与它们所代表的实际玩家的匹配程度如何。首先,我挑选了九名著名的球员(都是明星和名人堂成员,有点双胞胎荷马的偏见)来看看他们的表现如何:
Class mixtures for nine notable players, colors match class colors in the previous figures.
简而言之,这些玩家中的大多数都非常坚定地属于这个或那个职业,很少怀疑哪个职业最适合他们(至少在算法部分)。这一组中唯一的例外是皮特·罗斯,他主要是 5 班的学生,也有相当多的 6 班学生。为了进一步探究这个问题,我观察了每个班级中不确定性最大的球员,并找出了一些更容易辨认的名字:
Class mixtures for notable players who had a high degree of uncertainty associated with their class assignment.
然后,记住之前指定的每个职业可能代表的内容(职业 1 :内场能量;2 级:一垒传奇;三级:稳扎稳打;第 4 类:内场奇才;第五类:速度恶魔;6 级:强力外场手)
布鲁克斯·罗宾逊(1&4):三垒手,拥有游击手的射程和速度。有史以来最伟大的防守三垒手之一。
威利·麦科威(二班&三班):一垒手,实力不可思议。以令人生畏的强力击球手著称。
凯文·尤基利斯( Class 2 & 3 ):身材粗壮、擅长上垒的一垒手。
布雷特·布恩(1 级& 4 ):防守型二垒手,以强力击球闻名。
皮特·罗斯( Class 5 & 6 ): MLB 在安打和单曲方面的空前领先。在创纪录的五个不同位置(1B,2B,3B,低频,高频)17 次入选全明星。
何塞·包蒂斯塔( Class 3 & 6 ):外野手,不以速度著称,但擅长保送和 HR。
我不仅同意第一批全明星球员的分类方式(大部分都是一个级别的),而且我们所知道的更多混合级别的球员有助于解释为什么 GMM 对他们有更多的不确定性。例如,也许皮特·罗斯是如此杰出的球员的原因之一是他融合了强力外野手的一些最佳特质和速度高手难以置信的跑垒。
总而言之,击球手可以根据他们的击球和防守统计数据进行分类并不令人惊讶,尽管看到 GMM 的课程与球员的现实世界位置相符是令人惊喜的。我还认为这六个职业很好地包含了经理在制定阵容时可能会寻找的“原型”人员。它甚至在比较球员数据集时提供了一些见解;例如,迈克·特劳特更像巴里·邦兹和皮特·罗斯,而不是布鲁克斯·罗宾逊或凯文·尤基利斯。这种建模可能会也可能不会打破我们对棒球的理解,但我认为它提供了一些价值,作为对相同的旧数据的新观点。
你的 Spotify 音乐听起来像什么?Spotify 数据科学(第 1 部分)
“MacBook Pro turned on” by sgcreative on Unsplash
介绍
音乐一直是每个人生活中不可或缺的一部分。我们听到音乐,如果不是听音乐的话,无论我们在哪里,当我们学习时,我们听到美妙的声音,当我们参加聚会时,我们听到令人兴奋的刺激和节拍,当我们和朋友旅行时,我们听到令人兴奋和有趣的拼车卡拉 ok。音乐在我们周围无处不在。
如果我们可以使用数据科学来分析我们所听的音乐,从而获得关于我们所听音乐类型的见解,会怎么样?
动机
这个系列的动机是让任何人都能发现关于他们自己和他们所听音乐的模式和见解。这样做,可以更好地理解他们在听 Spotify 时的音乐行为。
**Note:** The code to collect data and perform insights on your own music is linked below.
为了实现这一点,我们将致力于展示量化衍生数据科学项目的完整端到端周期,并将分为以下几个部分。
1。探索性数据分析(第 1 部分:数据可视化)
在这里我们将学习统计分析的基础知识。这使我们能够了解我们正在处理的数据,并获得对我们所拥有的特征的见解。探索性数据分析通常是任何数据科学项目中最重要的步骤,因为它为构建进一步的分析提供了大量见解。
我们希望回答的问题包括:
- Spotify 上经常播放什么类型的音乐?有特色的音乐通常更有声音吗?
- 我们可能喜欢哪种音乐?
- 最流行的歌曲图表,遵循某种模式吗?
2。探索性数据分析(第 2 部分:统计测试)
在这一节中,我们将学习对我们在数据可视化中所做的观察进行一些统计上的严格处理。毕竟,我们想要定量地验证我们的假设。我们将执行的一些统计测试是卡方良好适合度和 T 检验,以及查看相关性。
3. A / B 测试
在这里,我们将了解如何在回答关于我们音乐品味的问题时进行 A/B 测试,例如:
我们希望回答的问题包括:
-我听的音乐风格是否与前 100 名播放的音乐风格不同,是否与 Spotify 上播放的音乐风格不同。
- 我们听什么风格的音乐可能比 Spotify 上的典型音乐更明显
- 最后,我们是普通人吗?意思是,与最流行的歌曲相比,我们听的音乐是否遵循相似的模式。
4.机器学习(建立推荐系统,向我们推荐我们可能感兴趣的新歌)
这最后一部分将使用我们从探索性数据分析和 A/B 测试中获得的见解,开发一种机器学习算法,为我们推荐新歌!
探索性数据分析(可视化)
Spotify 上经常播放哪些风格的音乐?有特色的音乐通常更有声音吗?我们可能喜欢哪种音乐?最流行的歌曲图表遵循某种模式吗?
数据科学最重要的方面之一是将大规模数据集中到一条信息中的能力。这使我们能够回答我们可能有的问题,并更好地了解我们的个人行为和我们喜欢的音乐类型。
Spotify 上经常播放哪些风格的音乐?
数据科学的一个重要部分是理解我们收集的数据的分布。我们关心发行情况,因为它让我们了解各种音乐风格的频率,以及频率的形状,就好像它们在 Spotify 上一样。让我们先来看看 Spotify 上精选歌曲的分布情况!
Distributions of music styles featured on Spotify
通过观察分布图,我们可以立即观察到以下情况:
- 在特征语音和声音中有一个非常大的向下的斜率,我们可以注意到在接近曲线末端的分布中有一个轻微的向上的尾部。**这向我们表明,Spotify 上精选的歌曲的音乐风格总体上较少声学或言语。**上升尾向我们表明,高语音或声学的歌曲更有可能在上限附近被选择。
或者更定量地说,被评价为超过 25%的声音或语言风格的歌曲不太可能出现在 Spotify 上。
- Spotify 上展示的大多数歌曲往往不太生动,随着歌曲的生动增加,它在 Spotify 上展示的可能性降低。
- Danceability 似乎呈正态分布,分布的尾部表示出现在 Spotify 上的可能性较低。
- 属性,化合价和能量看起来大致均匀(均匀分布)。表示对那些影响 Spotify 上精选音乐选择的属性没有偏好。
总之,Spotify 上播放的歌曲往往表现出较低的声音、语音和活力,而效价和能量对 Spotify 上播放的歌曲没有显著影响。最后,大约 65%的可跳舞歌曲是 Spotify 上最常见的特色。
我们可能喜欢哪种音乐?
咚咚咚,谁在那里?这是什么音乐风格,太棒了!让我们来看看吧!
音乐品味可以很好地反映我们的情绪和感觉。它们给我们一种身份,一种安全感,更多的时候,它们是一首旋律,伴随着我们的日常生活起伏。
当我们感觉不可思议的时候!我们会听感觉像站在世界之巅的音乐!当我们心碎的时候,我们会听一些反映失去所爱之人的歌曲。这种对我们生活的内省观点,实际上可以概括在我们所听的音乐中!
所以,让我们看看我们能从目前我最喜欢的歌曲中发现什么!
Box-plot of my favorite songs by style
从上图中我们可以观察到以下情况:
- 我听的歌在声、价、舞、能上分布很正态。
- 我们可能会注意到活跃度和语速的分布集中在下限,这表明我听的音乐不是很活泼也不是健谈。
我们可以观察到,我倾向于欣赏更有声、更适合跳舞和更有活力的音乐。不太喜欢活泼或有声的音乐。
最流行的歌曲图表遵循某种模式吗?
鲍勃,为什么你的音乐如此普通!因为它们对你的口味来说毫无意义。色调色调色调
排行榜上的前 50 首歌曲无疑是全世界播放量最大的歌曲,无论你是在购买新包时听它,还是在咖啡馆与朋友交谈时听它。它无处不在。但是,我们似乎从来不介意听这些歌曲,在某些情况下,随着我们的耳朵适应音乐,它们可能会变得乏味。但是我们从来不说“伙计,我受不了听这首歌,它伤了我的耳朵”,这是为什么?
这是不是前 50 名歌曲采用的一种模式,让我们可以享受背景音乐中的歌曲,甚至有时可以跟着一起唱?
让我们来了解一下!
我们将通过绘制前 100 种音乐风格的方框图来实现这一点!
Box-plot of the top 100 charting by style
通过观察箱线图,我们可以看到大多数进入前 100 名的歌曲是:
- 非常适合跳舞和精力充沛。但是在声音、语音和生动性方面较低
排行榜前 100 名中的歌曲表现出对非常适合跳舞的歌曲的高度偏好,而语速较低。例如,泽德的《中间》,马希梅洛的《快乐》。
结论
我希望你们都非常喜欢通过可视化 Spotify 上的前 100 首图表歌曲、精选歌曲和我个人最喜欢的歌曲获得的见解!
If you would like to try this for yourselves and have a look at your own Spotify tastes and try to do this yourselves, I've attached the link to the code I've used to collect this data [here](https://github.com/Chippasaur/spotifyMe)
如果你真的喜欢这篇文章,请吧👏并分享给你的朋友。这将让我知道你们真的很喜欢这个系列的第一部,如果是这样的话,我会继续做更多。记住,你最多可以鼓掌 50 次——这对我真的很重要。
数据科学和 DPO
为什么雇佣一个无视数据科学的数据保护官就像买一辆装甲车开着兜圈子?
如果数据是数字经济的燃料,那么欧洲新的数据保护一般准则提供了一个法律路线图,说明我们现在可以如何处理欧洲公民的个人数据。对于所有处理个人和敏感数据的组织来说,这项新立法的关键是雇佣一名数据保护官的义务(DPO)。雇主们要小心了,因为仅仅基于他们的法律知识来雇佣 DPO 不会让你更接近你的战略目标。让我们先看看你未来的 DPO 的义务、资格和责任,然后再关注他们理解数据科学的本质和目标的需求。
在一般数据保护立法于 2018 年 5 月 25 日生效之前,指定一名数据保护官是对私营公司和私营组织的强制性要求。这项新的欧洲立法要求,任何处理或存储大量欧洲员工或客户数据的公司,无论其运营地点在哪里,都必须指定一名 DPO。还必须在定期捕获、存储或转换欧洲公民数据的组织中任命 dpo,无论其运营基础如何。任何定期、系统地监控个人数据以及处理敏感数据(健康、种族、民族、宗教等)的非军事机构。)亦须符合法例规定。考虑到这些需求的范围,难怪最近的一项研究得出结论,仅在未来几个月内,就将有 28 000 名 DPO 员工被雇佣。 【我】
数据保护官将在消费者、雇主和利益相关者面前承担广泛的组织责任。DPO 将确保组织数据流程符合 GDPR 系统。他们将被要求建立公司进行的所有数据处理活动的全面记录,包括所有处理活动的目的。他们还将进行审计,以确保合规并主动解决潜在问题。DPO 成为员工和客户的单一联系点,员工和客户希望了解他们的数据如何被使用,以及公司采取了哪些措施来保护个人信息。最后,DPO 是公司和国家数据保护机构(NPA)之间的参照点。【二】
尽管责任如此广泛,但欧洲监管机构几乎没有就 DPO 候选人必须具备哪些资格提供具体指导。第 37 条要求数据保护官具备“数据保护法律和实践的专业知识”除此之外,法规建议候选人应该对组织的 IT 基础设施和技术有透彻的了解。DPO 必须是本组织内的一个独立理事会,对如何处理数据的决定没有直接责任。公共和私人组织可以共享 DPO 的服务,但不允许以短期或定期合同雇用 DPO。
雇佣一个对数据科学知之甚少的 DPO 很可能是无效的,而且会适得其反。DPO 必须了解组织收集个人和敏感数据的原因,而不仅仅是方式。从技术上讲,个人和敏感数据不需要全部存储在组织中,因为只要数据科学团队能够访问唯一的引用,他们就可以根据需要从各种外部数据源重新构建所需的记录。他或她应该意识到,数据科学家对囤积个人和敏感数据的兴趣不如探索个人(或技术)之间的关系如何影响集体信念或动机和行动。DPO 应该是数据科学团队的一部分:因为 GDPR 的法律要求不是限制其使用数据科学的约束,而是可以指导其在您的业务中应用的考虑因素。
DPO 需要超越职能部门的责任和义务,从更大的角度探究组织收集数据的原因。今天,任何组织的成功都取决于其利用数据的能力,不仅是为了了解组织过去的表现,也是为了预测和影响未来的制造商趋势。这种开发数据流程可在组织的各个层面促进分析:扫描市场环境以了解其业务挑战的性质,鉴定手头的数据,确定解决问题的正确方法,并将数据转化为行动呼吁。DPO 需要相信并宣扬这样一种愿景,即数据不仅仅是需要监控和控制的组织副产品,而是一种变革力量,将有助于定义组织如何看待其市场、资源以及在可预见的未来的竞争优势基础。
许多培训中心可以在培训未来的残疾人组织干事方面提供帮助和援助。可以在 EC 网站以及 NPA(法国 CNIL)的网站上找到极好的信息、基准和资源来源。几所大学开始提供关于 DPO 的法律和技术角色的短期课程和/或高管学位。私人咨询公司正在关注审计、流程改进和报告等更实际的问题。在商业分析研究所,我们在会议、大师班和 DPO 证书中阐述了数据科学和 DPO 实践之间的内在联系。我们坚信雇佣一个对数据科学一无所知的数据保护官就像买一辆装甲车绕圈行驶——你可能觉得受到了很好的保护,但实际上你哪儿也去不了。
注册参加我们新的为期一天的“成为数据保护官”大师班。商业分析实践是商业分析学院的核心和灵魂。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们对数字经济、数据驱动决策、机器学习和视觉通信的关注将使分析为您和您的组织服务。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们
【I】Heimes,r .(2016),研究:至少需要 28,000 个残疾人组织才能满足 GDPR 要求
【ii】Jakubowicz,L. (2016),数据保护官(DPO):定义、形成和安全
【iii】Lord,n .(2018),什么是数据保护官(DPO)?
数据科学训练营:透明的结果
Image Credits : https://smallbiztrends.com/2015/10/financial-transparency.html
与编程训练营相比,数据科学训练营社区尚未广泛接受成果报告。事实上,编程训练营实际上是成果透明的先锋。Hack Reactor 和其他几个编程训练营成立了结果报告诚信委员会,你可以看到一些成员发布的排名数据。数据科学训练营社区没有理由不能复制或采用 CIRR 标准。还有一项由一些 CIRR 成员发起的请愿活动。
对结果的透明让一切都变得公开。
这是一个非常复杂的情况。数据科学训练营主要是根据他们的排名来判断的。如果数字看起来不错,一些训练营不会公布详细的安置报告,因为这可能被视为商业秘密。另一方面,如果数字很糟糕,那么公布和宣传它们并不符合他们的最佳利益,因为学生可能会决定逃跑。在一天结束的时候,那些在参加训练营之前没有做足够的尽职调查和研究的学生就会被淘汰。
我们认为,有一些中间立场,对所有相关方都有利,包括学生、训练营和潜在雇主。
如今,大多数数据科学训练营教授的大量材料正在商品化,你可以选择自学,但仍不会错过太多内容。一些做得好的训练营倾向于在训练营经历的某些方面花费大量时间,而你在自学时可能不容易复制。这些方面包括雇主介绍、拥有活跃的校友基础、导师、积极的强化等等。这些在短期和长期都有很大的价值。
参加数据科学训练营是一项高风险、高回报的投资,但一些数据科学训练营通过他们的宣传倾向于将其作为低风险、高回报的投资,这并不准确。
我们知道一个事实,一些数据科学训练营将那些在一定时间后无法找到工作的人从他们的名册中删除,并且不包括在他们的安置统计中。我们还知道一个事实,一些数据科学训练营雇用他们的一些毕业生作为项目的助教,然后将他们视为数据科学家。从表面上看,这样做实际上没有错,你可以为此提出一个很好的论点,但当数据科学训练营发布安置数字而没有说明他们是如何得出这些数字的,你可以看到这些数字是如何看起来比实际情况好得多的。
我们认为,今天运营的一些数据科学训练营已经强行推销了自己,并从本质上设定了这样一种叙事,即训练营经历的唯一积极结果应该是数据科学工作。这个非常高的门槛让他们注定失败。现实情况是,潜在的学生出于各种各样的原因选择这些课程,包括过渡到数据科学相关的机会。数据科学训练营需要捕捉这些学生的意图,并对它们非常透明。
我们认为,数据科学训练营面临的最大挑战是如何确保他们继续以非常可量化和可衡量的方式(位置或积极成果)提供价值,并以某种方式找到保持相关性的方法。
如果你是一名准数据科学训练营的学生,你肯定应该要求查看一些最近队列的详细安置统计数据。这有助于您了解根据您的目标所涉及的风险(可能并不总是过渡到数据科学工作)。这篇文章可能有助于你进行尽职调查。
这是转贴自的原创文章并做了一些修改
保持联系!
我希望你喜欢这篇博文。请随时通过 Linkedin 或 Twitter 与我联系
数据科学和业务战略
在我从上一篇帖子中获得令人鼓舞的反馈后,我想我会继续我的旅程,接受一个更大的挑战(在回到 IBM 员工流失项目之前):使用数据科学来塑造业务战略。这是我以前从未尝试过的事情,所以我认为尝试一下是有益的,希望能学到一些东西。
我在这个项目中使用的数据来自 Kaggle 的自行车共享需求竞赛:
[## 自行车共享需求| Kaggle
城市自行车共享系统的使用预测
www.kaggle.com](https://www.kaggle.com/c/bike-sharing-demand)
数据集中包含的字段如下:
- 日期时间:小时日期+时间戳
- 季节 :
1 =春天,
2 =夏天,
3 =秋天,
4 =冬天 - 假日:该日是否视为假日
- 工作日:该日是否既不是周末也不是节假日
- 天气: 1:晴,云少,部分多云,局部多云;
2:薄雾+多云,薄雾+碎云,薄雾+少云,薄雾;
3:小雪、小雨+雷雨+散云、小雨+散云
4:大雨+冰托盘+雷雨+薄雾、雪+雾 - 温度:摄氏温度
- atemp :“感觉像”摄氏温度
- **湿度:**相对湿度
- 风速:风速
- 临时:发起非注册用户租赁的数量
- **已注册:**已启动的注册用户租赁数量
- **计数:**总租赁次数
该数据集非常有限,因为它只显示了自行车租赁需求如何随着天气条件、一天中的时间和季节性事件(节假日)而变化。该案件没有提供太多关于 Capital Bikeshare 的商业背景或商业战略的信息。这需要我做一些研究,以更好地了解业务和他们的经营更广泛的背景。
定义目标
由于我没有太多的信息可以利用,我决定保持目标尽可能简单— 超过我们当前的轨迹 。这样做绝对不仅仅是简单地预测我们的增长,我还需要知道取得成功的最佳举措。
下面是我决定使用的项目结构:
- 预测未来 3 个月的自行车共享需求(我们目前的战略将带我们走多远?)
- 调查影响需求的因素(目前什么是重要的)
- 增加需求的潜在机会(我们能做些什么来实现我们的目标)
预估需水量
为了知道我的目标是什么,我必须知道我当前的轨迹会把我带到哪里。为了做到这一点,我决定看一看脸书的 Prophet 库,它被设计用来做时间序列预测,并支持 R 和 Python。
在我继续之前,我肯定要感谢 José Roberto Ayala S 的精彩和鼓舞人心的文章,这篇文章在向我介绍脸书的先知图书馆时是非常有用的资源。如果你想了解更多关于脸书先知图书馆的信息,请访问此链接:
Prophet 是一个用 R 和 Python 实现的预测程序。它速度很快,并提供完全自动化的预测…
facebookincubator.github.io](https://facebookincubator.github.io/prophet/)
在我可以用数据集进行任何预测之前,我必须准备好数据,以便它可以符合我的目标,同样重要的是,与脸书的先知库兼容。我是这样创建我所使用的数据集的:
我要做的下一件事是将数据分开,用于培训、验证、测试和调整:
开始使用 Prophet 非常容易,我只用了几行代码就开始运行了:
Getting Started with Facebook’s Prophet Library
验证期间的预计租赁数量为 188186 ,但实际上,它应该更接近于 208939 。投影一点都不差(相差只有 10.45%)。我还应该指出,这个模型使用了 José提出的值。我决定做的下一件事是使用 Prophet 来查看我对 2012 年 11 月 8 日到 2012 年 12 月 19 日期间(31 天)的预测。
此期间的总项目预计为 240016 。
更深的潜水
在发现我的轨迹后,我需要知道我能做什么来改变它。我首先从一个相关矩阵开始。我认为这将是有用的,看看哪些价值有助于在给定时期的自行车租赁数量。这是我想到的:
Correlation Matrix for Bike Rental Demand Data
该矩阵显示,租赁数量与临时客户和注册客户的数量密切相关。正如你所想象的,我对自己最初的发现很不满意。所以我决定看看图表还显示了什么。我注意到“温度”、“ atemp ”和“湿度”字段与计数字段有相当程度的相关性。我还发现’天气和’季节的相关性得分也很显著。
虽然我认为这些发现是有用的,但我需要知道更多。我需要了解是否有任何我可以利用和利用的优势。操纵天气绝对不是一个选择,此外,预测天气本身就是一个挑战。
我决定采用另一种方法来发现重要变量,这涉及到发现数据集特征的重要性:
最重要的功能是“假日”功能。我发现这非常令人惊讶,但也非常有用。假期不一定是可以被操纵的,但它们可以被预期…并为计划。
然后我决定调查自行车租赁和假期之间的关系:
A graph which shows how rentals fluctuate based on the holiday.
显而易见,假期肯定与租赁数量有某种因果关系,所以我决定找出哪些假期具有最显著(和积极)的影响。租金上涨的节日有独立日、退伍军人节、劳动节和哥伦布日。值得注意的是,哥伦布日租金上涨了 35.93% ,是四次上涨中涨幅最高的一次。
发现这一点后,我意识到我已经获得了第一块拼图。
把所有的放在一起
对于这个项目,我将把商业战略定义为实现公司长期目标的决策和行动。
约翰逊和斯科尔斯将战略定义为:
“一个组织的长期方向和范围:在一个不断变化的环境中,哪个通过资源配置实现组织的优势,以满足市场的需求和利益相关者的期望。”
在思考如何利用数据科学来制定业务战略时,我想到了查看不同级别的业务战略:
- 公司战略:一家公司应该进入的市场,并通过竞争来定位自己,以实现其长期目标。
- 商业战略:公司为了实现其公司战略而必须采取的具体目标和行动。
- 职能战略:使一个组织能够实现其战略目标的日常运作的调整。
我认为,通过采用这种方法,我将有一个视角,使我能够尽可能简单地说明数据科学过程的输出和业务战略的开发之间的联系。
既然我知道租金确实会受到节假日(尤其是哥伦布日)的影响,我就有了制定商业策略的起点。我认为围绕对租金有最大影响的假期建立一个商业策略可能是有用的。我还认为,在实施我提出的策略后,预测预测的租赁数量将如何变化可能是有用的。
我问自己的第一个问题是“哥伦布日在华盛顿特区有什么可做的?”在我的研究中,我发现华盛顿州 DC 市在哥伦布日有很多可做的事情和可去的地方,包括:
- 白宫花园之旅
- 品尝华盛顿美食节
- 克里斯托弗·哥伦布纪念喷泉
- 乔治·华盛顿的弗农山
- 跳上跳下观光巴士旅游
我还对 Capital Bikeshare 做了一些研究,以了解他们提供的更多服务,这样我就对我必须要做的事情有了更好的了解。我很高兴地发现,他们有相当多的路径,他们有相当多的选择额外津贴提供给他们的客户,最明显的是提供给首都自行车共享客户的折扣。
然后我有了一个想法。我想:“如果能有一个全包的首都之旅,包括参观这些地方的一小部分,会怎么样?”我认为这肯定值得探索。我也认为这可能是明智的,让它成为一个家庭事务,并引入团体价格,使产品更具吸引力。
这将包括通过利用现有的合作伙伴关系来打造新的体验,并可能与其他企业发展新的关系,以便我们能够接触到新的客户。当我第一次想到它时,我并没有想到它,但很有可能,那些通过“旅游服务”(我现在称之为旅游服务)获得的客户中的一小部分,可能会成为回头客。
利用我们能够利用提供给我们的数据发现的东西,我们现在有了新业务战略的构建模块。
最后的想法
我当然希望今天的博文是有用的。像往常一样,我问,如果你对这篇文章有任何想法或意见,请与我分享。如果你对未来的博客文章有任何想法,请随时分享。我绝不是这方面的专家,但我想成为专家,所以我正在尽我所能寻求帮助。
为了进一步探索
用这些数据创建的其他 Kaggle 内核:
[## 自行车共享需求| Kaggle
城市自行车共享系统的使用预测
www.kaggle.com](https://www.kaggle.com/c/bike-sharing-demand/kernels)
这是资本自行车共享公司系统数据的链接。根据他们分享的内容,实际上有可能使用他们的数据来规划哥伦布日游,并决定如何实施商业计划。
开发者、工程师、统计学家和学者可以找到并下载首都自行车共享会员的数据…
www.capitalbikeshare.com](https://www.capitalbikeshare.com/system-data)
Python 中的要素选择:
你用来训练你的机器学习模型的数据特征对你可以…
machinelearningmastery.com](http://machinelearningmastery.com/feature-selection-machine-learning-python/)
如果你像我一样,目前正在培养你的商业头脑,你可以在这里了解扩大产品线的好处:
对于希望增加收入或扩大市场的小型企业来说,扩大产品线是一项重要的增长战略…
smallbusiness.chron.com](http://smallbusiness.chron.com/four-reasons-expand-product-line-55242.html)
下一步是什么?
在我的下一篇文章中,我想我会看看如何构建一个自然语言生成系统。到目前为止,我所有的帖子都涉及到向用户提供某种信息,但我觉得有必要改进这种方式。这将是我的下一个挑战。
下次见。
给年轻自己的数据科学职业建议
数据科学职业建议
我不知道这些想法是否会让年轻的我受益。我想他们会的。
If there’s such a thing as a career ladder, I think it looks something like this.
据我所知,数据科学在 2012 年左右开始成为一个普遍使用的术语,当时《哈佛商业评论》的一篇文章称其为“21 世纪最性感的工作”。当我读那篇文章时,我记得我曾想,这是我三四年来一直试图做的事情。我开始称自己为数据科学家,在我的职业生涯中,我担任过数据科学职位,并在安全和智能、旅游、资产管理、教育和广告行业建立和管理数据科学团队。
在我的职业生涯中,我对作为一名数据科学家在哪里工作以及如何工作的想法发生了很大变化。过去对我来说非常重要的事情现在已经不重要了。一些我曾经回避甚至看不起的事情,最后却给我带来了很多满足感。事后看来,我明白如果当时知道一些我现在知道的事情,我会多么感激。这篇文章是我总结其中一些教训的尝试。我希望它们可能对一些即将进入这个行业的人有用。
只有向上迈一步,如果这不是向侧面迈一步的话
我曾经在一个组织中努力晋升到一个相当有权威的职位,这个组织是同类组织中规模最大、资金最多、地位最高的组织之一。首席执行官是该行业最大的参与者之一。我进入了执行委员会,并最终领导了组织中的所有技术问题。我在组织中担任最高的技术相关职位,是董事会会议的必要出席者,诸如此类。就职业而言,这比我做过的任何事情都让我离我想要的地方更远。
不要误会我的意思:我学到了很多东西,也有很多机会,这些都有助于我达到现在的位置。但这不是升职。这是一次职业转变。我写的代码越来越少,写代码是我真正喜欢做的事情。我不得不把越来越多的设计决策交给其他人,因为我没有时间自己去做。我跑了所有我喜欢做的事情,但是我没有真正去做任何我喜欢做的事情。它越来越多地占用了我离开家人的时间。我到了那种地步,我做的几乎没有一件事是有意的——都是反应。这简直不健康。
我确信其他人可以达到更高的位置,并且比我做得或可能做得更好。此外,回过头来看,我可以看到该组织有多少功能失调。在某些方面,它甚至是有毒的。但是除了这些问题,我发现作为一个执行者比作为一个经理/主管/主管更令人满意。我真的喜欢设计东西。我并不总是选择能最大化我花在设计上的时间的职位。在我职业生涯的大部分时间里,我没有想到去思考我在工作中做的所有事情,并找出让我最快乐的事情,即使它们没有给我更多的报酬或更好的头衔。我希望我早点做那件事。
不要试图去改变世界
在我职业生涯的大部分时间里,我都在寻找工作能让我解决一些重大社会问题的方法。这就是在安全和教育领域工作吸引我的地方。当我在一家旅行社工作时,我在一家教育类的旅行社工作,这家旅行社给学生提供身临其境的体验。当我从事资产管理时,我为一家希望投资新兴经济体的公司工作。
我认为关注社会公益是一个错误。各个组织的愿景和执行能力各不相同。根据我的个人经验,更广阔的视野往往伴随着更弱的执行能力。我现在工作的公司成立时有一个非常明确的目标:想出如何在期望的时间和预算内,在期望数量的潜在客户面前投放广告。我曾经轻蔑地称这种愿景为“小部件制作”我学会了制作小部件的乐趣。因为我工作的公司已经学会了制作非常好的小部件,我们这些在那里工作的人可以自由地扩展到 R&D 的工作中。
我现在做的工作几乎都是我认为有趣的 R&D,如果该公司多年来没有短视地专注于打造一个超级好的广告小工具,以及支持它的所有基础设施,这一切几乎都不可能实现。我现在直接从事线下和线上行为的交叉,我认为这是我能从事的最有趣的事情之一。我认为,如果我寻找一家明确专注于改变世界的公司,或者甚至是一家专门为了解线下和线上行为的交集而成立的公司,我从事如此有趣主题工作的机会会少得多。当我不再试图做大事时,我得到了做大事的机会。
坚持那些重视个人贡献的组织
在我见过的大多数组织中,都有一个经理层级,但实施者的情况非常简单:一些个人贡献者被认为比其他人更有经验或更有能力,他们的薪酬和任务分配经常反映这一点,但在组织权威方面没有太大差异。在我目前的工作中,有一个明确的非管理职业阶梯,较高和较低阶梯之间的差异与设计权限有关:随着你的职位越来越高,你在实施什么以及如何实施方面被赋予了更多决策权。经理们关注的是业务需求的优先级、人际关系、确保资源的可访问性等等。
整个经历把我宠坏了。我不认为我能回到一个管理者控制实施的组织。我觉得我不能回非工程类的机构。在晋升只意味着管理的组织中,做一名技术员工是很难的。我希望我的职业生涯能少花些时间在这些类型的组织中。
位置很重要,但不是你怎么想
现在回想起来,我想当我搬到纽约市时,我偏离了方向。我意识到,我居住的弗吉尼亚州夏洛茨维尔并没有给我提供太多的发展机会:它太小了,尤其是在数据科学工作方面。所以我环顾四周,发现这个行业真正的中心,至少在当时的美国,是旧金山和纽约。我没有意识到这些市场已经饱和了,尽管它们很大。有大量的工作机会,但是有更多的申请人在竞争这些工作。
我在纽约找了一份工作,最终换了一份更高级的工作,也是在纽约。然后是时候离开那份工作了。这就是我看到在大型枢纽工作的不利之处。我要么(1)接受一个入门级的职位,拿着它的入门级工资,只是因为有太多的供应,我不能要求更多的个人贡献者职位,(2)改变职业生涯,成为一名全职经理,(3)相信我的运气和我的储蓄账户会坚持下去,因为我在等待一家公司寻找我的确切资料,(4)回到一家基本上不懂技术的公司,就像我以前工作过的一些公司一样,或者(5)搬到一个市场不那么饱和的地方。
我的家庭经济状况(是的,还有自尊心)不允许我担任初级职位。我不想再当经理了。我不愿意耗尽我们的积蓄来等待运气(因为它真的主要是运气)。我不想成为这个房间里最聪明的技术人员。那时我决定在纽约之外、比夏洛茨维尔更大的地方找工作,那时我意识到二三线城市的吸引力。
我把湾区和纽约市放在第一层,可能还有西雅图和波士顿。我把芝加哥、亚特兰大、奥斯丁、华盛顿、DC、丹佛和北卡罗来纳研究三角这样的地方放在第二层。我把哥伦布、盐湖城、印第安纳波利斯、纳什维尔等城市放在第三层。(如果你来自这些地方,不喜欢你所在的层级,不要对我大喊大叫——这是个人的启发,而不是经过验证的分类)。
与美国其他地区相比,所有这些二线城市的科技产业都非常大,而与一线城市相比,这些产业都很小。他们没有他们需要的那么多有经验的人,部分原因是一线城市正在吞噬更有经验的人(我怀疑,他们中的许多人正在接受管理工作或报酬低于他们经验所允许的工作,因为他们正在与一大批同样渴望就业的人竞争)。虽然在下一层位置可供选择的公司越来越少,但这些公司仍然在做真正有趣的事情,而且有足够多的公司在未来仍然有机会在不移动位置的情况下转移工作。
工作/生活的平衡几乎比任何事情都重要
我开始认识到,在一个承认我有权与家人共度时光的地方工作,对我的幸福是多么重要。在我目前的工作中,当我需要在家工作或早回家或晚回家处理事情时,没有不祥的摇头或皱眉。只要我能满足人们对我将交付什么以及何时交付的期望,并且不妨碍其他人满足他们的期望,我很大程度上可以按照我需要的方式安排我的时间和剩余的生活。我做过的其他工作并不总是这样。直到最近,我才意识到灵活性的缺乏在多大程度上抵消了一大堆额外津贴和福利。当然,这是个人喜好。我想说的是,我花了比我希望的更长的时间来承认这种偏好。
一份总结
当我回顾这些年来我面试过或工作过的公司时,我很少想起:
- 对他们想要达到的目标有非常明确的定义。
2.已经在政策、人员和基础设施方面进行了投资,以始终如一地做他们计划要做的事情。
3.首先是一个工程组织。
4.明确支持那些希望在不成为经理的情况下成长的个人贡献者。
5.为有家庭的人支付体面的工资,并想为退休储蓄和/或买房。
6.对聘用高级人员进入非管理领域感兴趣。
7.认可员工在工作之外拥有充实生活的权利。
8.提供持续有趣和富有挑战性的分析工作。
当我在大型科技公司面试时,我发现对第四和第六点的支持有限,对第七点几乎没有支持。当我在科技创业公司采访时,他们通常处于难以置信的早期阶段,因此在#1、#2、#5、#6 和#7 上失败了。当我采访拥有大量或不断增长的技术业务的大型非技术公司时(基本上放弃获得第三名),我发现他们几乎总是在第一名和第二名失败,而且几乎从未提供第八名。我发现最吸引我的公司都是处于创业后期的公司。在许多情况下,我仍然发现它们落在#4 和#7 上,有时落在#5 和#8 上,但这似乎提供了最多的信号和最少的噪声。
嗅觉测试
这对我来说可能有些过了,但我觉得那些最好地体现了我上面概述的优先事项的公司是那些在他们的技术访谈主题上最灵活的公司。在我上一次找工作时,我实际上拒绝了白板面试或其他技术任务。
我仍然认为这是一个好主意——除了非常初级的候选人,在这种情况下,问题应该非常简单和一般,我认为技术挑战是一种不人道的,也是无效的人力资源实践。当我开始告诉公司,如果他们坚持一项技术任务,那么我可以说这是一个糟糕的文化适应,我有几个人同意在没有白板的情况下进行面试,然后他们基本上会尝试在没有白板的情况下进行白板面试(这比使用白板更难)。
我仍然对 MaxPoint(我现在的雇主,尽管我们现在是 Valassis Digital 的一部分)印象深刻,在那里,面试官让我带他们浏览我自己认为会有帮助的代码。我的黄金标准仍然是我在英格玛经历的,在那里我和另一位数据科学家坐在房间里,我们一起计划如何开始解决一个他们自己都不知道答案的真正的业务问题。我想我可以通过观察一家公司在评估我作为候选人时的灵活性来了解这家公司。如果我的目标是其他优先事项,这可能不会是一个强有力的指标。
理想很重要
因此,如果我突然发现自己在找工作,我个人会在对我有吸引力的下一级地点寻找晚期创业公司。我会寻找一些公司,它们有足够的资金,不会试图让我累死或克扣工资,在市场上已经取得了足够的成功,我可以衡量它们是否擅长自己的工作,并且足够专注,不会假装试图改变世界。一旦候选公司在如何评估我的问题上表现出不灵活,我就会解雇他们。我知道我的经济状况并不总是能让我对工作地点如此挑剔。我仍然认为理想是一个重要的目标。
我的职业目标发生了很大变化。我已经学会了宁可夸大家庭的成本,也不要夸大特定职业变动的职业收益。我已经学会了从工作中获得极大的满足感,但我的大部分快乐来自于与我的职业完全无关的事情。对我来说,这是一个相当大的变化,我认为这是一个健康的变化。就像我说的,我不知道这对其他人来说是不是一个好的生活方式。但是,现在回想起来,我发现我做的许多选择排除了我思考工作以外的任何事情的能力,那不是一个健康的地方。
与此同时,如果没有经历过过去不同工作的雄心和挫折,我不认为我能从目前的职业状况中获得如此多的满足感。如果没有最初帮助我形成这些建议的经历,也许所有这些对年轻时的我的建议都不会有任何帮助。尽管如此,我还是希望早点知道这些事情。如果没有别的,我想这会给我一个更清晰的愿景,让我知道我的职业生涯将走向何方。
编辑:我又写了一篇关于 的帖子,给年轻的自己 。
数据科学职业生存指南
我最近读了一些关于数据科学中的问题和角色的文章,主要是组织没有真正做好数据的例子,以及这如何影响崭露头角的或有经验的数据科学家。
阅读这些文章引起了我的共鸣。我认识到所有的问题,我不认为我是一个人。下面,在一点介绍之后,是在工作生活中导航的方法,尝试和探索当生活不完美时我们能得到什么好处,成为一个更好、更全面的数据科学家。
背景
我认为最好的写作包括:
您应该如何构建您的数据科学和工程团队? by @math_rachel 谈团队结构问题
避免成为 @Springcoil 的数据科学家
以及这个由 @treycausey 发布的 twitter 帖子,这感觉就像是一个可怕的熟悉的数据科学灾难列表。
常见的主题是,许多数据科学工作并不像他们宣传的那样。好吧,生活不总是达到预期并不是最令人震惊的故事——这些说明了围绕数据科学的工作很难这一事实所带来的悲哀。
感觉就像全世界都在对组织大喊,“要么使用你的数据,要么去死”,但是弄清楚如何交付却远非易事。理解数据科学家和工程师应该做什么,如何让团队适应业务,以及哪些项目将积极地触及底线,需要一套非常特殊的技能和经验,因此文章阐述了日常挫折。
我不想重复上面文章中的常见问题,而是想为构建您的数据科学体验提供一些建设性的建议。当这些情况出现时,就有机会了。我相信,如果你知道如何从一种情况中获得良好的经验,你就可以继续走在幸福的道路上,在你的职业生涯中前进。
这里有一个潜在的假设:你正在接近数据科学,目标是用数据解决问题。没有某种数据科学定义的数据科学文章是不完整的。作为一名数据科学家意味着身兼数职,解决许多组织的问题意味着灵活。我相信数据科学家是定义和衡量 Kaggle 竞赛的人,而不总是获胜的 ML 研究员。一个负责收集和理解相关数据及其与业务问题的相关性。
将数据转化为有效的数据产品,不仅仅是掌握最新的人工智能或深度学习方法论的问题。这在实验室可能行得通,但在成千上万销售真实产品并存在日常数据问题的公司中却行不通。同样,如果成为一名数据科学家仅仅是数字技能的话,上面的文章都不需要写。
如果你的职业目标是解决一般的人工智能,并且你在脸书和 DeepMind 有 5 年的经验,那么不,我不能保证下面的内容会有一点点帮助。
如果你的目标是有所作为,用数据解决问题,这是让你成为一名真正有吸引力的雇员的那种东西,你正在阅读,让我们使用上面雷切尔·托马斯的文章,并思考“妈的,这就是我!”(我做了,因此这篇文章)那么请充分利用这个机会。
这些问题
A terrible business intelligence metaphor but I miss my Subaru.
数据科学团队面试一位具有令人印象深刻的数学建模和工程技能的候选人。一旦被录用,候选人将被安插在一个需要简单业务分析的垂直产品团队中。数据科学家很无聊,没有利用他们的技能。
这就是“我们需要一个商业智能平台”的情况。管理层可能不知道这一点,否则他们不会聘请数据科学家。您可能正在编写大量的 SQL,甚至可能认为 Excel 真的是这方面的合适工具…
所以,是的,解决 BI 问题。要查看的工具是 Looker 或 Mode 或 Google Data Studio 。你自己的目标是不再做 BI,让你现在的角色过时,实际上只需要几个小时就可以运行一个演示。
如果数据科学的核心是数据产品,那么 BI 平台将提供实际构建产品的体验,但没有太多的复杂性。客户,市场,需求都为你布局好了。
你将了解到拥有客户、采用和反馈——这是正确的解决方案,但你不能把复杂的 UI 强加给一大群用户。好好分享你的 demo 吧。
在业务方面,你将了解真正重要的指标,即使技术不是挑战,你也将了解是什么改变了你组织的底线。销售团队每天需要多少号?他们要求什么,什么数字真正让 CEO 夜不能寐?什么是你的客户喜欢的令人敬畏的仪表板?
在技术方面,您将了解到 SQL 是非常强大的,而那些需要很长时间才能完成的连接只需要几秒钟。数据集比你的硬盘还大,更不用说 RAM 了。SQL 简单多了。Hadoop 产生 Hive 产生 Impala 产生 Presto 是有原因的。或者大查询。或者 SparkSQL。条条大路通 SQL。这可能是数据科学家能够学到的最实用的技能。
您将学习结构化数据、OLAP、优化查询,可能还会学到很多关于索引数据的知识,可能还会学习 ETL 和使用 Airflow 或 Luigi 进行调度。从那里,将所有事情自动化。比如预测模型和构建完整的数据产品。
数据科学团队是独立的(不嵌入其他团队)。他们创造了从未被使用过的很酷的东西。组织中的其他人对他们所做的工作没有认同,一些数据科学家对什么可以实际投入生产没有很好的认识。
为什么数据科学家不了解什么可以投入生产?这份工作的目的是要有所作为,而达不到生产目标会让人非常沮丧。数据科学不能孤立存在,但在一些支持下,你可以取得很大进展。你需要学习如何在组织内部建立团队,数据科学是一项团队运动。你的团队需要谁?
Data Science is Team Sport
第一个实际变化:确保交付是设计过程的一部分。对于一个推荐系统来说,改变你的网站可能很难,但是你能给客户发邮件吗?您如何从客户那里获得特征向量?什么是最简单、最容易的生产路线。模型不是产品制造出来的。
其次,一些好消息是,开发和部署之间的技术壁垒每天都在变小。部署模型所需的支持一直在减少——谷歌的 CloudML、亚马逊的机器学习和 Azure 的 ML Studio 都提供了将模型作为服务发布的途径。采用这些服务可以使您更加敏捷,并减少工程开销。想想看,5 年后会是什么样子?
第三——从根本上说,你需要把什么东西投入生产?当软件需要一天 24 小时运行时。你将如何知道什么时候出了问题,并修复它,检查你没有破坏其他任何东西?这些都是关键的工程技能,也是最起码要理解和理想地掌握的重要技能。
将您的工作投入生产是一个重要的面试问题,需要展示,您在这里可以学到的一切都是为了培养您的数据科学技能。
数据科学家生产模型的速度远远快于工程支持将模型投入生产的速度。
暂时忘记,你是在建模型。同样的问题也经常发生在用户界面的改变上。或者营销信息。有大量的创造性工作无法投入生产。积压背后的原因之一是没有测试资源来评估新想法。你是 A/B 测试新模型,当然?
将优化模型的问题转化为在最短时间内优化决策的问题。部署新模型的潜在风险是什么?您的业务不会受到数据建模能力的限制,即使您是一名出色的数据科学家,但当涉及到测试平台时,您的业务会受到限制。这为数据科学家提供了不同的角度、技能和发展机会。
也许你有一个成熟的测试过程,但是如果新特性超出了测试能力,那么问题就变成了优先级的问题。平均来说,大约 10%的分割测试成功,我会找到链接。每次测试都要付出在测试期间运行劣质产品的代价。这意味着您可以通过优化成功的测试来建立竞争优势。如果 10%转移到 20%,你只是转移了底线。哪些支持数据改进了您的设计流程?测试新产品不仅仅是随机的想法,而是短暂的“了解你的客户”。
获取领域知识,了解客户,并以此打造更好的产品。或者形成更好的假设,这不是很吸引人,但在技术上更正确。少犯错就好。
Both Engineering and Bridge Building are important data science skills
数据基础设施工程师独立于数据科学家。管道没有数据科学家现在要求的数据,数据科学家没有充分利用基础设施工程师收集的数据源。
假设除了基本的 R 脚本之外,你还有一些编程经验,这里的机会是参与数据工程。作为数据科学家、数据工程管道的客户,您在构建优秀的数据管道方面处于非常有利的位置。如果数据是垃圾、杂乱、非结构化的,你需要对其进行清理。你的既得利益,至少意味着你有动力和对质量的眼光,这是很少有纯数据工程师会有的。你的工作和未来取决于能否把这件事做好。
但是——不是坏事——这真的意味着学习 Java。也许你有很好的 Python 基础设施,但是 Java,或者至少 JVM,是这里的第一类公民。Java 最难的是过滤掉 20 年的历史,所以找个好的来源,从 Java 8 开始。http://www.baeldung.com/才华横溢,为许多常见的数据问题提供了清晰的教程(JSON,我在看着你,你这个反复无常、前后矛盾的混蛋)。
对于框架,Spark 现在是 2.2,Apache Beam 是 2.0.0,Kafka 接近 1.0。这些平台比过去的原始 Hadoop 要好得多,可以很快在云中创建实例。
任何当前的数据工程师都应该能够用持续集成、Git 来支持你,并指导你完成代码评审和编码标准。这些都不是坏事。事实上,这是非常好的。掌握数据工程技能将使你远远超过许多候选人。无论如何,数据科学中 80%的数据准备实际上是数据工程——你理解的那一部分然后形成数据。
如果这还不能令人信服,我能求助于权威吗?http://threaded . stitch fix . com/blog/2016/03/16/engineers-should nt-write-ETL/
该公司已经明确决定了功能/产品 x。他们需要一名数据科学家来收集一些支持该决定的数据。数据科学家觉得项目经理忽略了与决策相矛盾的数据;项目经理认为数据科学家忽略了其他业务逻辑。
我认为从这次经历中可以吸取两个教训。
首先,世界上显然有人不相信全球变暖,尽管所有的证据都与此相反。伟大的数据科学需要伟大的故事讲述和令人信服的论点。通过理性讨论形成观点的能力是很难的。如果可以的话,你可以从非常遗憾地错过的汉斯·罗斯林身上汲取灵感。在那里,制造简单的直觉案例来尝试改变看法。
其次,对数据保持谦逊,并理解数据科学是而不是业务。
这自然意味着 数据科学团队不是业务中最重要的部分。数据科学现在非常热门,但我们必须记住,大多数企业都是通过其他方式赚钱的(https://data science . Berkeley . edu/mailchimp-John-foreman-data-smart/)
考虑一个运行中的分割测试——产品负责人想知道哪个版本胜出了,或者至少一个版本更好的可能性。是 73%。16 周后。他们将推出新功能。需要做出决定。其他因素在做出这个决定时起着重要的作用,很少有单一的最佳答案。
额外技能
有战略眼光。如果你能发现上面的问题,你就比任何人都更有资格提供解决方案。
简单的思维实验——你可以立即获得每一种 ML 技术的全面知识,但你必须留在你目前的公司。你在做什么项目,你在哪里度过你的时间?我认为,回答这个问题是铺平更长久职业生涯的大门。技术和工具总是在发展,没有人能跟上每件事,但是理解如何应用这些技术对领导者来说仍然是一项有价值的技能。
几个警告
数据科学是一个不断发展的领域,它不像软件工程那样成熟,这个术语涵盖了许多不同的领域和工作描述。对我来说,数据科学是关于利用数据获得一些好处,希望是社会的,好的,但金融、商业和组织都适合。
- 不要卡住。不要呆在无聊的地方,不断转移到不同的领域,即使它们并不完美。以上每一部分都是一个警告,也是一个机会。一旦你不再学习,不再解决问题,继续前进。
- 一条红线是没有得到解决问题的支持。如果你受雇于一个商业智能角色,但没有得到支持或授权来引入工具,那么尽快行动。你不会成长发育。
最后一句话
开头的文章强调了这位领先的数据科学家目前在实践中面临的一些重大挑战:从理论到模型再到产品。很容易将每一点理解为“缺少技能 X,正确做 X ”,但这些挑战中的每一个都提供了学习和发展的机会,并为下一代创造更好的工作场所。
当今的数据科学家
- 了解每个必要领域所需的技能、面临的挑战和最佳实践
- 可以围绕这些领域建立一个团队
- 定义战略
- 可以将这些产品推向市场
将成为明日的产品经理、团队负责人和首席数据官。
获得大量领域的经验可以让你更加全面,并为建立团队和提供目前非常罕见的数据领先地位铺平道路。不仅要学习技术,还要学习技术如何随时间变化,它将走向何方。了解如何与企业和您的数据客户合作、新兴的专业领域以及团队中需要哪些人来让数据为您的企业服务。
请谅解。今天的经理们也在努力解决这个问题。像你希望被支持一样去支持别人。
The End
数据科学案例研究:物联网中的分类
Don’t let your health and youth go to waste. Also, that’s me squatting!
介绍
我们将研究来自 UCI 机器学习库的日常运动和活动数据集。这项工作的目标是训练一个分类器,根据从连接到所有四肢和躯干的设备收集的传感器数据来预测用户正在进行的活动。这将通过巧妙的传感器数据特征工程和训练机器学习分类器来实现。
我们将从这两篇文章中引用机器学习研究人员所做的工作:
科学是同行评审的
请查看这项工作的 Jupyter 笔记本。
动机
物联网(IoT)是一个不断增长的技术领域,它寻求在汽车、家用电器,是的,甚至(特别是)人身上安装电子监视器。物联网可穿戴设备越来越受用户、公司和城市的欢迎。物联网的承诺是更智能地向电网输送能源,更智能的交通控制,实时健身反馈等等。毫不奇怪,初创公司正在寻求利用物联网的前景。
The promise of a smarter city.
Fitbit 已经成为健身可穿戴设备的代名词。它受到各种各样的人的欢迎:马拉松运动员全程记录自己的心率,而普通人只是想增加他们每天的步数。
Fitbit watch
Spire.io 的目标是利用从他们的可穿戴设备收集的生物特征数据,不仅跟踪心率和活动持续时间,还跟踪用户的呼吸频率,以提高注意力。冥想已经在西方社会大规模传播开来。神经科学继续证明冥想对身体和心理健康的益处。Spire.io 肯定会加入其他初创公司的行列,这些公司寻求向越来越多寻求更好地预防身心疾病的用户提供技术。
Spire wearable
Comfy 利用物联网和机器学习来智能监控和调节工作场所的舒适度。他们的设备和分析可以自动调节工作场所的温度,并减少了员工投诉,提高了生产率。
Intelligent climate control
可穿戴设备和其他显示器的快速普及要求数据科学家能够分析这些设备产生的信号数据。凭借必要的技能,数据科学家可以为营销和产品团队提供可操作的见解,并构建数据驱动的产品,从而提高用户参与度,让我们的生活变得更加轻松。
关于数据
8 个用户都参与相同的 19 个活动。5 个设备(4 个肢体和 1 个躯干)中的每一个都有 9 个传感器(x、y、z 加速度计、x、y、z 陀螺仪和 x、y、z 磁力计)。对于每个用户的每个活动,以 25 Hz 的频率在总共 5 分钟的 5 秒时间段内收集数据。
这 19 项活动是:
坐着(A1)、
站着(A2)、
仰卧和右侧躺着(A3 和 A4)、
上下楼梯(A5 和 A6)、
站在电梯里(A7)
并在电梯里走动(A8)、
在停车场行走(A9)、
在速度为 4 公里/小时的跑步机上行走(在平的和 15 度倾斜的位置)(A1 0 和 A11)、
在速度为 8 公里/小时的跑步机上跑步
在踏步机上锻炼(A13)
在交叉训练器上锻炼(A14)
在健身车上以水平和垂直姿势骑行(A15 和 A16)
划船(A17)
跳跃(A18)
打篮球(A19)。
数据结构:
19 个活动(a)(按上述顺序)
8 个用户§
60 个分段(s)
躯干(T)、右臂(RA)、左臂(LA)、右腿(RL)、左腿(LL)上的 5 个单元
每个单元上的 9 个传感器(x、y、z 加速度计、x、y、z 陀螺仪、x、y、z 磁力计)
数据检查|探索性数据分析
Let’s dive right in!
为了简单起见,让我们加载一个单独的片段,看看一个人在停车场行走的数据是什么样子。
我们可以从左腿和躯干加速度图中看出,这个人必须以正常的速度行走。这一点从波峰之间的间距大致恒定这一事实可以明显看出。如果有人以不规则的步速行走(即慢-快-慢行进),那么我们会看到频率的变化(稍后将详细介绍频率)。
设备在所有三个空间维度上的加速度是周期性的,以时间不变平均值为中心。
出于好奇,垂直维度是 X 方向,Z 方向指向远离设备的方向,与地面平行。有关尺寸和设备方向的更多信息,请参见识别日常和体育活动。
上面的配对图显示了条件概率:人的加速度的 X,Y,Z 维度是如何相互关联的。对角线图显示信号分布近似为高斯分布。我们还可以看到,在底部三角形中,分布的中心彼此靠近。顶部的三角形以散点图的形式显示了维度之间的条件关系。
这些观察很重要。由于信号近似正常,我们可以在特征工程阶段利用这一事实(稍后将详细介绍)。
特征工程
Feature Engineering is cleaver transformations.
我们将基于两篇论文的成功研究,采用他们的方法进行特征工程。
我们将为每个细分市场添加新功能。新特征是每行分布的均值、方差、偏斜度和峰度(因为信号是正态的,正如我们前面看到的,我们可以计算它们的统计矩)自相关
序列的前十个值,以及具有相应频率的段的离散傅立叶变换
的最大五个峰值。
我们将每个特征归一化为[0,1]之间的值,然后将每个 5 秒的片段展平为具有 1140 个特征的单行。如此大量的特征将引入维数灾难并降低大多数分类器的性能。因此,我们将通过应用主成分分析 (PCA)来降低维度。
然后,每个展平的行将成为结果数据矩阵中的单个样本(行),分类器将最终对其进行训练和测试。
步伐
1.为原来的 45 个特性中的每一个获得 19 个附加特性。
2。归一化[0,1]
3 之间的所有特征。减少每个片段的尺寸
4。将这些片段堆叠起来,为每个人建立一个数据集
1.提取 19 个附加特征并转换数据集格式
让我们依次检查工程特性。
均值、方差、偏斜度和峰度
我们看到每个信号的分布都是近似正态的。这意味着我们可以对每 5 秒的片段取前四个统计矩。通过包含这四个时刻,我们正在帮助我们的模型更好地学习每个独特活动的特征。
自相关
在一些时间序列任务中,例如在 ARIMA 中,希望最小化自相关,以便将序列转换为平稳状态。我们可以在下图中看到,在滞后两步之后,我们在之前看到的序列中出现了统计上不显著的自相关。
出于我们的目的,我们希望从每个样本的自相关中提取前 10 个点,并将这 10 个点中的每个点视为一个新特征。我们为什么要这么做?这个想法是,每一个物理活动将有一个独特的自相关序列。因此,我们希望捕捉这种独特性,以帮助我们的模型了解活动之间的差异。
查看另一个人跳跃的下一个自相关图。我们可以看到,该活动没有统计上显著的自相关(除了滞后为零时的完美自相关)。我们看到跳跃的自相关序列不同于行走。
这是使用自相关图的前 10 个点创建新要素的直觉和理由。最终,这一点或任何工程特征的有效性将由模型的性能决定。
离散傅立叶变换的最多五个峰值
傅立叶变换函数在时间和频率空间之间来回映射信号。每个信号都是正弦函数(正弦和余弦)的线性组合。
第一个等式将信号从时间空间(t)变换到频率空间(ω)。第二个方程是逆变换。
这些方程显示了连续的变换。实际上,像 Python 的 SciPy 这样的编码包要么计算离散情况,要么对连续情况进行数值逼近。
下图显示了如何将信号分解成正弦曲线,确定每条曲线的频率,并最终将原始时间序列表示为频率序列。
Pretty cool, huh?
下面我们有一个人行走系列的躯干加速度的 Y 方向图。第一个图显示了时间序列信号的样子,第二个图显示了相应的频率信号的样子。
出于我们的目的,我们将提取 5 个最大峰值,并为每个样本中的每个值创建特征。我们为什么要这么做?回想一下上面的傅里叶变换图像,频率最高的曲线负责宏观振荡,而无数的小频率曲线负责微观振荡。这些宏观振荡决定了曲线的总体形状。每个活动的信号都有不同的一般形状。通过捕捉这些有影响的频率,我们的机器学习模型将能够更好地区分活动。
2.正常化所有特征
所有要素都在值 0 和 1 之间重新调整。
3.减少每个部分的尺寸
上图显示了所有 1140 个特性的解释差异。我们可以看到,解释的方差迅速下降到接近零。
底部曲线显示,在第 40 维之后,解释的方差几乎不变。这里的目标是减少维度的数量,并尽可能多地包含可解释的差异——这是一种平衡行为。两篇研究论文都表明,他们将维数降低到 30,收到了极好的效果。因此,我们将效仿他们的工作,将数据集的特征减少到 30 个。
如果我们创建并遵循我们自己的启发式方法来决定保留多少特征,我们可能会选择排除除了最小数量的特征之外的所有特征,这些特征解释了 90%的差异。
我们要取前 30 个主成分向量。
建模和预测
最后,到了性感的部分!我们将探索两种预测用户活动的方法。
方法 1
我们将创建包含来自每个用户的混合样本的训练和测试集。因此,该模型将根据来自每个用户的数据进行训练,并预测测试集中每个用户的活动。
方法 2
我们将包括 7 个用户的数据作为训练集,并将剩余的
个用户的数据作为测试集。这里的目标是预测模型从未见过的用户的活动。*
在每种方法中,我们将遵循相同的模型构建框架:
- 将数据分为定型集和维持集
- 优化模型超参数
- 通过分析学习曲线交叉验证模型性能
模型
在此分析中使用的机器学习模型是逻辑回归(LR)、支持向量机(SVM)和随机森林(RF)。为了简洁起见,我们将重点放在 LR 和 SVM。
建模方法 1
- 创建包含来自每个用户的混合样本的训练集和测试集。
- 根据来自每个用户的数据训练模型,并预测测试集中每个用户的活动。
网格搜索|优化的内存管理
对于每个唯一的超参数组合,简单的网格搜索实现会将数据集的副本从磁盘读入内存,这大大增加了运行网格搜索所需的时间。
一个更简单的网格搜索实现将只使用单个内核来顺序训练模型。请记住,拟合一个模型与拟合其他模型是完全独立的任务。因此,在数据工程社区中,这项任务通常被称为令人尴尬的并行任务。
以下网格搜索实现使用 ipyparallel 包来创建本地集群,以便同时运行多个模型拟合——与可用的内核数量一样多。
这个网格搜索实现还利用了 Numpy 的内存映射功能。每次拟合模型时,我们不会从磁盘读取数据集的副本,而是将数据的只读版本映射到内存,每个内核都可以引用它来拟合模型。
并行化和内存映射的结合大大缩短了网格搜索过程。
交叉验证|学习曲线
在我们深入研究这些图告诉我们关于我们的模型的什么之前,让我们确保理解这些图是如何生成的。
生成学习曲线
我们为四个指标绘制了一条学习曲线,我们将使用这四个指标来评估我们模型的性能:准确度、精确度、召回率和 f1 分数。这些图表上绘制的每个点都是由以下交叉验证流程生成的指标得分。
首先,数据被分为训练集和保持集。训练集被进一步分成 k 个折叠,并且每个折叠被迭代地用作训练集的一部分或验证集,以便训练模型。一旦模型定型,它就用于预测定型集和维持集的值。蓝色曲线表示对定型集进行的预测,绿色曲线表示对维持集(我们在这里也称为测试集)进行的预测。)
分析学习曲线|逻辑回归
学习曲线包含了关于我们模型的丰富信息。
让我们看看精确度学习曲线。我们可以看到,当我们将训练集的大小从 1000 个样本增加到 2000 个样本时,测试集的分数增加了大约 5%。随着我们继续增加训练集的大小,我们看到测试的准确性没有增加。测试集精度的这种饱和表示模型的偏差。偏差表明模型不够复杂,无法从数据中学习,因此无论对多少训练点进行训练,都无法提高其性能。这也被称为欠拟合。
训练曲线和测试曲线之间的差距表明了模型预测中的方差的数量。理想情况下,模型在这两条曲线之间会有一个非常小的间隙,这表明模型可以很好地概括看不见的数据。这是合乎需要的,因为替代方案是更大的差距,表明测试分数比训练分数差。这表明模型正在学习只预测以前看到的数据,而不是学习可概括的趋势和模式。这被称为过拟合。我们可以看到,逻辑回归既有偏差又有方差。
最后,我们可以看到逻辑回归的所有指标从未超过 50%。如果我们随机猜测样本属于哪一类,我们的正确率大约是 5%(因为有 19 个活动)。虽然 LR 的表现比 random 更好,但我们想做到比 50%的准确率好得多。
分析学习曲线| SVM
支持向量机模型的表现明显优于逻辑回归。看一下精度曲线。它表明,该模型能够在预测训练集的活动分类方面做得近乎完美。
更重要的是,该模型以接近 99%的准确率对测试集中的活动进行分类。测试曲线显示,随着在更大的数据集上进行训练,SVM 的性能有所提高。训练曲线和测试曲线之间的差距可能看起来很大,但请记住,这两条曲线之间的差异约为 0.01%,这是一个非常小的差异。我们可以从这些学习曲线得出结论,SVM 遭受了非常小的偏差和方差。这就是我们在即将投入生产的车型中所期望的性能类型。
精确度|召回
到目前为止,我们一直专注于准确性度量,但精度和召回呢?
Precision 告诉我们预测为肯定的分类实际上是肯定的百分比。为简单起见,假设我们正在处理一个二元分类问题,其中 100 个样本被预测属于正类。100 个肯定预测中有 90 个实际上属于肯定类别,在这种情况下,我们将这些预测标记为真肯定 ( TP )。另一方面,100 个阳性预测中有 10 个实际上不属于阳性类别,它们是被错误预测为阳性的阴性样本,在这种情况下,我们将这些预测标记为假阳性 ( FP )。
回忆告诉我们模型能够多好地识别属于正类的点。这听起来很像精确,但事实并非如此。召回将 TP 与假阴性 ( FN )进行比较,其中 as 精度将 TP 与 FP 进行比较。这里的区别在于,对于每个被错误地预测为属于负类的样本,模型可以正确识别为属于正类的样本就少了一个。
回忆是对区分积极和消极分类失败的一种度量。
精度是对正确预测肯定分类失败的度量。
最后,f1 分数是精确度和召回率的加权平均值。f1 分数用于衡量这两种类型的失败。
回到我们的案例研究,看看 SVM 的精度曲线。它告诉我们,100 个被预测为属于正类的样本中,有 99 个实际上属于正类。现在,因为我们的数据集有 19 个类,而不是 2 个,标签“积极”和“消极”类失去了意义。当存在两个以上的分类时,我们可以重新解释测试集精度学习曲线,以表示预测属于特定类的 100 个分类中有 99 个实际上属于该类。
建模方法 2
- 创建一个由 7 个随机选择的用户组成的训练集和一个由剩余用户组成的测试集。
- 训练模型来预测以前未见过的用户正在从事哪些活动,而不仅仅是针对以前见过的用户。
分析学习曲线| SVM
哇哦。发生了什么事?
记住,训练集包含 7 个用户,测试集包含第 8 个用户。学习曲线显示了大量的过度拟合。蓝色的训练曲线代表训练集中的 7 个用户。该模型可以预测已经看到的用户的活动。然而,绿色曲线告诉我们,该模型无法推广到新用户。
这些结果可能归因于我们采用的特征工程方法。人们走路、跳跃、上下楼梯等等的方式都是独一无二的。我们有理由得出这样的结论:我们已经成功地捕捉到了特定个体特有的身体运动,但还没有捕捉到对这些活动在人群中是如何进行的概括理解。
根据我们的目标,我们可以得出我们成功了或者没有达到目标的结论。如果我们的目标是为每个人建立并奉献一个模型,那么我们可以得出结论,这项工作是一个巨大的成功!
另一方面,如果我们的目标是建立一个模型,从任何用户那里学习行走信号或跳跃信号的样子,那么我们将不得不承认我们有所欠缺。
结论
我们已经看到了对时间序列数据和信号处理的理解如何能够导致工程特性和构建机器学习模型,这些模型能够以 99%的准确率预测用户正在从事的活动。
事实证明,我们的方法成功地构建了一个模型,该模型可以预测出现在训练集和测试集中的用户活动。该模型能够学习哪些信号对应于特定用户的行走或跳跃等活动。然而,当用户被限制出现在训练或测试集中时,我们看到该模型不能获得独立于用户的关于哪些信号对应于特定活动的概括理解。
这项工作可以直接应用于 Fitbit 和 Spire 这样的物联网创业公司。两家公司都在从可穿戴设备上收集信号数据。对用户参与的活动类型进行分类是有价值的信息,可用于构建数据产品和推动营销工作。
关于作者
Alexander Barriga 拥有 GalvanizeU (纽黑文大学)的数据科学硕士学位和加州大学伯克利分校的物理学学士学位。他目前是旧金山大会的数据科学讲师。
数据科学案例研究:优化零售中的产品布局(第 1 部分)
利用数据科学创造价值的实用方法
在之前的一篇文章中,我写了一种我在数据科学项目中创造价值的方法。快速回顾和总结我在那篇文章中所说的,数据科学的目标是*赋予更好的决策能力。*这样做需要我们有 同理心 来确保我们问了正确的问题并且使用了正确的信息。
当与价值主张画布并置时,数据科学项目可以被视为满足客户需求(即决策)的产品,处理与做出这些决策相关的挑战,并最大化从做出正确决策中获得的利益。
数据
在今天的帖子中,我将使用的数据集来自 Analytics Vidhya 的’ Big Mart Sales III '数据集,该数据集可通过他们的一次练习比赛获得。你可以通过下面的链接来看看。
练习题:大卖场销售 III |知识与学习
datahack.analyticsvidhya.com](https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)
数据描述(取自比赛现场)
BigMart 的数据科学家收集了不同城市的 10 家商店的 1559 种产品的 2013 年销售数据。此外,还定义了每个产品和商店的某些属性。
数据集中包含的数据如下:
- Item_Identifier: 唯一产品 ID
- 项目 _ 重量产品重量
- Item_Fat_Content: 产品是否低脂
- Item_Visibility: 商店中分配给特定产品的所有产品的总展示面积的百分比
- Item_Type: 产品所属的类别
- Item_MRP: 产品的最高零售价格(标价)
- Outlet_Identifier: 唯一店铺 ID
- **奥特莱斯 _ 成立 _ 年份:**店铺成立的年份
- 商店占地面积的大小
- Outlet_Location_Type: 商店所在城市的类型
- 商店类型:商店是杂货店还是超市
- Item_Outlet_Sales: 特定商店中产品的销售额。
问题定义
如前所述,在这个项目中,我们将试图找到最佳的产品植入选项,以最大化 Item_Outlet_Sales 变量。为此,我们将创建一个模型来预测某些商品的价值,然后提出可能的方法来改进该产品的位置。
利用我们所知道的创建我们的客户档案我们得到:
- **工作:**优化植入式广告
- 痛苦:忽视影响销售的因素
- **收获:**洞察客户喜好。
制定方法
为了创建正确的数据产品,我们将这样做:
- 建立用于创建销售预测的模型
- 了解影响销售的因素
- 根据影响销售的因素,提供增加原始预测的建议
发现最重要的,但易处理的特征
我认为值得分享的是,我使用 XGBoost 的特性重要性函数来确定我想要操作的特性,以便改变销售预测。下图显示了数据集中各种要素的重要性:
A graph showing the features that have the greatest impact on sales.
Pretty Simple eh?
在图表上显示的所有特性中,请务必注意 Item_MRP、Outlet_Type、Item_Visibility、Outlet_Size 和 Outlet _ Location _ Type——这些是易处理的特性。对于这个项目,我假设我们希望让 MRP 保持原样。其中最重要的是“Outlet_Type”变量。调整预测主要意味着选择将产生最有希望的预测的出口类型。
在这样做的时候,我决定最好在现有的商店(和它们各自的配置)中循环,因为只有 10 个 BigMart 商店。
这样做的代码如下:
Creating an Item-Outlet pairing for generating an Adjusted Forecast.
生成我们的新预测相当简单,是这样完成的:
最后的结果
运行我编写的程序后,产生了以下建议:
I recommend that Item '**FDW58**', be moved from Outlet '**OUT049**', to Outlet '**OUT027**'.
The adjusted forecast is expected to be **64.0%** better (**2606.40**), than the original forecast of **$1589.31**.Configuration details:
Outlet_Size: Medium --> Medium
Outlet_Location_Type: Tier 1 --> Tier 3
Outlet_Type: Supermarket Type1 --> Supermarket Type3
Outlet_Age: 19 --> 33
理解价值主张
将所有这些与我之前提到的价值主张设计和数据科学项目联系起来,我们可以将我们的设计总结如下:
- **产品和服务:**为产品建议最佳放置选项的数据产品。
- **止痛药:**减少决策的不确定性。
- **收益创造者:**产品在最需要它们的顾客触手可及的地方。
请注意,在这个例子中,我们的解决方案不仅为大商场的员工解决了一个问题,还影响了他们的顾客。考虑那些受我们产品支持的决策影响的人,对于创造正确的产品至关重要。
结论
值得注意的是,这种算法通常出现在“完美系统”用例中,如游戏和模拟,其中系统的所有规则都是已知的,没有未知变量。不幸的是,生活不是这样的。应用于“假设”场景的机器学习技术仅用于提供关于什么可能产生最佳结果的指导。
尽管我们获得了销售数据,但我们仍然不确定所观察到的购物习惯的季节性,这肯定会对推荐的质量产生影响。这个系统的一个更好的版本将能够找到多种产品的最佳放置选项,同时允许用户优先考虑一种产品。
我希望这篇文章给了你一个清晰而实用的方法,用你的数据科学为项目创造价值,我希望你能学到一些新的东西。像往常一样,我欢迎您的反馈,并期待产生更多的内容。
在这篇文章的最后,我想对一些非常重要的人大声疾呼。首先,我要感谢 数据助手 的可爱员工,感谢他们为我们提供问题、指导和数据科学帮助。如果你正在寻找一位数据科学导师,我强烈建议你从那里开始。我还要感谢Rachael Tatman让我加入他们,也感谢她在 Kaggle 在数据科学教育方面所做的出色工作。
如果您想了解更多关于我用来构建本案例研究中提到的解决方案的工具,请查看下面的链接:
xgboost -可扩展、可移植和分布式梯度增强(GBDT、GBRT 或 GBM)库,用于 Python、R、Java、Scala…
github.com](https://github.com/dmlc/xgboost) [## XGBoost 中超参数调整
在本教程中,您将学习使用本机 XGBoost API(对于 sklearn API,请参见上一教程),它…
cambridgespark.com](https://cambridgespark.com/content/tutorials/hyperparameter-tuning-in-xgboost/index.html#training-and-tuning-an-xgboost-model)**
成为数据科学家@ LinkedIn
Data Science Connect 是一个关于一切数据的免费网络研讨会。我们的主要目标是帮助尽可能多的有抱负的数据科学家,将他们与聪明的头脑联系起来。有这么多的路线可以选择,听到一个以上的声音总是最好的。
在我们的第一个系列中,我们有幸采访了一位来自 LinkedIn 的数据科学家。你可以在这里观看完整的采访。
Avinash Ahuja 在 LinkedIn 从事市场动态方面的工作,他的工作已经产生了很大的影响。
你可以从任何行业进入数据科学。不是计算机专业出身或者没有编程经验都没关系。你可以随时捡起来。真正重要的是你有解决问题和积极进取的态度。只是想找到解决办法。
土木工程到数据科学 7:10
当你看着我们周围的世界。我们正在努力优化一切。这适用于任何领域。我们正试图找到提高效率的最佳解决方案。无论想最小化什么,我们都可以用 ML。令人惊讶的是所有这些是如何完美地结合在一起的。
他于 2013 年来到美国学习土木工程。他花了整整一年的时间才意识到优化才是他真正感兴趣的。他在研究土木工程中的计算机视觉和最优化问题。"我是班上倒数 25%的学生。"他不是优等生。他使用了大量的线性代数和微积分,特别是对他自己在土木工程领域的研究。
我什么都不知道…当事情变得艰难时,你会投入时间和精力。你是什么军衔并不重要。每个人都有糟糕的时候。你要做的就是继续努力,不要停下来。
他花了一年时间参加了 ML 课程,然后在 2014 年秋天,他参加了他的第一个机器学习课程。他花了很长时间才明白 ML 是什么。2014 年春天,他上了社会经济学网络课。现在他对 DS na 感兴趣,知道 ML 的具体细节。他申请了 2015 年的 DS 团契,他在芝加哥完成了他的团契。他于 2016 年毕业于 din,并在 linkedin 开始工作。
帮助客户/会员成功:18:00
任何时候你做任何分析,我们关注的是什么会给会员带来价值。什么能帮助我们的成员实现他们的目标。你如何追踪它?你的方法是始终专注于此。总是问自己我们如何为会员价值做出贡献。
让会员站在我们所做一切的最前沿。
其中一个核心问题是,这如何为会员创造价值。其他的都是次要的。我们都有不同的指标,每个指标都被用作我们成员体验的指南。基于这些属性,我们优化了会员的行为和体验
从学术界过渡到客户成功指标的挑战(业务)19:30
转变为关注客户成功指标的角色所带来的挑战。在学校里也没怎么涉及到。这很有挑战性,因为这是数据科学行业中人们不会说的话。问题是学校可能只是以一种非常抽象的方式教授这些算法。就像这里,这个 viz 适合这个数据,这个 viz 适合那个数据。使用回归,在这种情况下使用决策树。当你用神经网络处理大量数据时…
真正重要的是学会如何理解你的用户。而这并不是学校真正教的。与用户感同身受。这对用户有什么帮助?我们没有学到的是如何强调用户和产品。这应该是数据科学课程的一部分。
对用户的同情是我遇到的一个问题。从用户的角度来看。每个用户都是不同的,真正了解他们对产品的体验取决于你。这是学校里没有教的东西,需要学习。
其次是讲故事。最初,当我们进行分析时,我们有一个漂亮的图表。有这些图表和模型。但重要的是了解这如何转化为会员体验,以及如何影响业务。始终展示您的分析如何影响业务和用户的价值。您的指标需要转化为对用户和公司的影响。从收入、找到工作的可能性等方面来看。
数据科学如何入门 23:00
做数据科学的第一步就是模仿,直到你真正理解并内化了所有的概念。随着你的进步,你开始学习什么问题适合什么技术/分析。一旦你对这些工具和技术的使用有了大致的了解,你就可以开始寻找你自己的数据了。找到一个你想解决的问题,并对它进行分析。他的建议是你最初跟 Kaggle 学。但那不会让你走那么远。你必须超越这些,找到你自己的问题。新事物。有洞察力的东西。不一定是机器学习。它必须是新颖的,新的分析,解决问题的新方法。那就分享一下。这就是你学习和被关注的方式。
我学到了什么 27:55
在他的机器学习课程中,他学习了各种算法和技术,如决策树、回归、SVM 和内核。要记住的一件重要的事情是,你不应该只是学习这些算法来应用它并做出预测。真正重要的是理解模型背后的数学原理,并从头开始实现这些模型。不管你使用什么语言,是 python、java、matlab 等等,它实际上是构建整个模型和管道本身。真正了解模型的本质细节、科学和基本原理。这真的很有帮助,因为它给了你理解这些概念的信心,你可以和任何人谈论它们。本质上,你最终会知道如何从根本上优化这些模型。
我的学习方法 31:40
我做的第一件事就是暴力。我会参加一个 ML 课程并完成它。一开始你可能会很糟糕,但没关系。随着你的学习,你会开始知道你不知道的事情。这是你需要深入挖掘和学习的概念。你从这些事情中学习,然后重新开始。判断自己知道什么,不知道什么。
- 采取行动,开始学习
- 重新评估你的经验,看看你知道什么和不知道什么
- 学习你不知道的东西,然后再回头看一遍。
只要你随着时间的推移不断提高,这就是最重要的。
工具
- Python 和 R: R 的统计量更大。适用于汇总统计。Python 更适合生产。r 和 Python 是微不足道的,它真的取决于你从哪里来。对于大部分地方来说,无所谓。如果你知道 R,你就能处理 Python。有时候我会用 python,R,或者 Scala(取决于项目)。
- 线性代数和统计:统计很重要,因为你需要能够谈论数据。你需要知道什么是置信区间、方差、稀疏性、数据分布、均值/中值/众数和 A/B 检验。统计学是数据科学的基础。
- 其他:如果你想出人头地,你需要知道某些编程范式,了解 GIT、数据结构、OOP、网络算法之类的东西。这些如何在实验中发挥作用,以及它如何优化您的工作流程
文件和反馈的重要性 48:35
长话短说:开始记录吧。不要担心初稿的质量。去做吧。有一个完整的想法。考虑和未来的自己对话,告诉自己在做什么。过度记录没关系。如果你不做记录,你就会忘记你为什么做这做那。
- 记录你的模型、分析、可视化…重要的是把你的想法写出来。提醒你未来的自己为什么没有成功。比如,“嘿,随机森林没用,XGboost 也没用。看起来基于树的模型不起作用。”评论树算法不起作用。让我们尝试另一种算法,尝试回归。记下来,从中学习,然后重复。
- 你不会尽可能高效地编码。你编码是为了不让事情搞砸。作为一个整体意识形态来保护它。
反馈:这很重要,不要往心里去。试着自己走一遍,和别人谈谈你的模型,你可能会意识到你犯了不同的错误。人们的反馈让你明白人们会犯错误。如果是错误,那就从中吸取教训并改正它。
LinkedIn 1:00:00 的生活
日子变化很大。有时,根据不同的日子,我会和人们谈论他们的工作以及我所做的工作。但是在任何一天,我的工作要么是和别人分享我的工作,要么是喝咖啡,或者只是从他们正在做的事情中学习。没有议程。我对 LinkedIn 作为一家公司在做什么有一个整体的想法。它太大了。你需要积极主动地了解公司发生了什么,看看你能利用什么来帮忙。与人交谈并传播思想。也许我一周工作的 50%是从 SQL、构建代码审查、Hadoop 中提取数据。另外 50%是交谈,分享想法,和成员交谈。
`注释结束
凯尔和我很想听到你的反馈,尤其是你从第一集学到了什么。
要报名或获取更多信息,请访问我们位于 www.datasciencedreamjob.com的网站
👉加入我们在 www.datasciencedreamjob.com/free-tips的邮件列表,获得如何进入这个领域的免费提示
👉如需提前注册我们未来的网络研讨会,请点击此处:https://lnkd.in/gMT2pJd
30 条数据科学妙语
浓缩成 30 句引言的假日阅读清单
对于那些喜欢在假期吃大脑食物的人来说,这里有一个方便的索引,列出了我从 2018 年开始的所有文章,归结为 30 个(偶尔厚颜无耻的)妙语,帮助你避免/引起家庭活动和假日聚会上的尴尬沉默。
章节: 数据科学与分析,ML/AI 概念,如何不在 ML/AI 上失败,数据科学领导力,技术,统计学。
**额外收获:**视频、播客、供你的非英语朋友和家人欣赏的外语翻译,以及为你们当中的 Pythonistas 提供的端到端深度学习教程。
数据科学和分析
数据科学到底是什么? 快速浏览数据科学、数据工程、统计学、分析学、ML 和 AI。
数据科学是让数据变得有用的学科。
Twitter definitions circa 2014.
优秀的数据分析师做什么,为什么每个组织都需要他们 。优秀的分析师是数据工作取得成效的先决条件。让他们放弃你是很危险的,但是如果你低估了他们,他们就会这么做。
这三个数据科学学科各有所长。统计员带来严谨,ML 工程师带来性能,分析师带来速度。
秘密段落摘自《HBR 分析篇》 一篇从上面文章中略去的沉思集。我们来谈谈混合角色,研究的本质,Bat 信号,数据江湖骗子,牛逼的分析师!
买家请注意:有许多冒充数据科学家的数据骗子。没有魔法能把不确定性变成确定性。
人工智能和数据科学十大角色 。职位指南,按招聘顺序排列。
如果研究员是你的第一份工作,你可能没有合适的环境来好好利用他们。
ML/AI 概念
你会读到 对机器学习最简单的解释。机器学习是一种事物标签,你可以用例子而不是指令来解释你的任务。
机器学习是一种新的编程范式,一种向计算机传达你的愿望的新方式。这很令人兴奋,因为它让你能够自动化不可言喻的事物。
你是不是用错了“AI”这个词? 定义不清的术语,实际上并不存在正确使用它们的问题。我们都可能成为赢家,但这里有一个快速指南,可以让你了解 AI、ML、DL、RL 和 HLI 的字母汤。
如果你担心每个橱柜里都潜伏着一个类似人类的智能,请放松呼吸。所有这些行业人工智能应用都忙于解决实际的商业问题。
****【向孩子(或你的老板)解释监督学习。我的目标是让所有人熟悉一些基本术语:实例、标签、特征、模型、算法和监督学习。
不要被行话吓倒。例如,模型只是“配方”的一个花哨的词
机器学习——皇帝穿衣服了吗?通过图片和猫迷因,初学者可以轻松了解核心概念,包括算法和损失函数。
不要因为简单而讨厌机器学习。杠杆也很简单,但它们可以移动世界。
Neural networks may as well be called “yoga networks” — their special power is giving you a very flexible boundary.
无监督学习去神秘化 。无监督学习通过为你将相似的东西分组在一起,帮助你在数据中寻找灵感。结果就是一张帮助你做梦的罗夏卡片。
把无监督学习想象成让“物以类聚”的数学版本。
如果你拒绝把决策权交给你不了解其过程的事情,那么你应该解雇你所有的人类工人,因为没有人知道大脑(及其一千亿个神经元!)做决策。
如何不在 ML/AI 上失败
为什么商家在机器学习上失败 。许多企业没有意识到应用 ML 与 ML 算法研究是非常不同的学科。
想象一下,试着雇佣那些一辈子都在制造微波炉零件,却从来没有做过饭的人来开一家餐馆……会有什么问题呢?
Which of these are you selling? The right team to hire depends on your answer.
寻找 AI 用例建议 。我寻找应用机会的头脑风暴技巧始于想象人工智能是一个骗局…
企业犯的一个常见错误是假设机器学习是神奇的,因此可以跳过对做好任务意味着什么的思考。
AI 的第一步可能会给你带来惊喜 。启动一个 AI 项目的正确方法是什么?获得 AI 学位?不。雇一个人工智能巫师?没有。挑一个牛逼的算法?也不是那个。钻研数据?又错了!以下是如何做得更好的方法。
永远不要让一个博士团队“去把机器学习洒在业务的顶部,这样……好事就会发生。”
你的 AI 项目没戏吗? 在你雇佣任何工程师或者为一个应用的 ML/AI 项目获取任何数据之前,你应该通过的一个(现实)清单。
不要为了 AI 而在 AI 上浪费时间。被它能为你做什么所激励,而不是被它听起来有多科幻。
AI 入门?从这里开始! 决策者在应用 ML/AI 项目中的角色和职责的详细指南。
仅仅因为你能做某事,并不意味着这是对任何人时间的一种很好的利用。我们人类爱上了自己倾注心血的东西……哪怕是一堆有毒的垃圾。
AI 犯错是谁的错?人工智能的要点是你用例子而不是指令来表达你的愿望。为了让它起作用,例子必须是相关的。
如果你使用的工具没有经过安全验证,那么你造成的任何混乱都是你的错。人工智能和其他工具一样。
数据科学领导地位
**数据驱动?再想想 **。对于数据驱动的决策来说,驱动决策的必须是数据,而不是其他东西。看起来很简单,但在实践中却很少见,因为决策者缺乏一个关键的心理习惯。
分割数据的方式越多,你的分析就越容易滋生确认偏差。解药是提前设定你的决策标准。
数据科学是泡沫吗? 了解更多关于自称“数据科学家”的人,以及为什么这个行业在玩一场危险的游戏。
“我认为你可能会像毒枭为他的后院买一只老虎一样雇佣数据科学家,”我告诉他。“你不知道你想要这只老虎做什么,但其他毒枭都有一只。”
I don’t know any actual drug lords (or tigers), so I’m not sure what’s in those backyards. But you get my point.
**数据科学领袖:你们 **太多了。有什么计划来培训决策者,让他们掌握让数据科学团队成功的技能?希望不是策略!
…一种亲数学的亚文化,在这种亚文化中,对任何闻起来像“软”技能的东西表示蔑视是一种时尚。这都是关于你是多么热衷于熬夜证明一些定理或用你的第六语言编码。
**反思数据科学中的快与慢 **。产品开发团队是否有可能调和快速迭代与深度研究过程的缓慢移动的庞然大物,或者他们必须选择一个?
灵感是廉价的,但严谨是昂贵的。
**面试:给数据科学家的建议 **。坦诚回答数据科学家同事的问题。主题包括:喜爱的资源、职业、统计教育和数据科学领导。
有用比复杂更有价值。数据质量比方法质量更重要。沟通技巧比另一种编程语言更有价值。
技术
关于 TensorFlow 你应该知道的 9 件事。如果你有大量数据和/或你在追求人工智能的最新发展,TensorFlow 可能是你新的最好的朋友。这不是数据科学瑞士军刀,这是工业车床。这是它的新特性。
有了 TensorFlow Hub,您可以从事一种历史悠久的传统的更有效的版本,即帮助自己使用他人的代码并将其称为自己的代码(也称为专业软件工程)。
**5 个一口大小的数据科学总结 **。Google Cloud Next SF 2018 最喜欢的 5 场演讲。5 个视频摘要。5 分钟或更少。
人工智能花了半个多世纪被大肆宣传,而不是发生。那么,为什么是现在?许多人没有意识到,今天应用人工智能的故事实际上是关于云的故事。
统计数字
**不要把时间浪费在统计 **上。如何确定是否需要统计,如果不需要怎么办。
统计学是改变你想法的科学。
永远不要从一个假设开始 。从假设而不是行动开始是那些学习数学却没有吸收任何哲学的人的一个普遍错误。让我们看看如何利用统计数据进行决策。
假说就像蟑螂。当你看到一个,它永远不会只是一个。附近总有更多的藏身之处。
统计来去匆匆的人 。曾经希望有人能告诉你统计学的意义是什么,术语用简单的英语表达是什么意思吗?让我试着在 8 分钟内实现你的愿望吧!
数学就是建立一个零假设宇宙的玩具模型。这就是获得 p 值的方法。
——你做错了 。只有当你想要的信息(人群)和你拥有的信息(样本)不匹配时,统计方法才有意义。如果项目负责人不知道他们想要什么信息会怎么样?
在从样本到人群的伊卡洛斯式的飞跃中,如果你不知道你的目标是什么,那么期待一个大的冲击。
统计精明自测 。你能通过这个测试你统计专业知识的小测验吗?如果你相信他们在 STAT101 告诉你的,你可能不会…
如果你有事实,你就不需要统计数据了。
无能,授权,人口 。如果决策者没有正确的技能,你的整个统计项目就注定要失败。统计学家什么时候应该大惊小怪,什么时候应该温顺地服从命令?
如果你的目标是用数据说服人们,你也可以把严谨扔出窗外(因为那是它的归属),转而制作漂亮的图表。
翻译
我的第二个 Medium 账号上有其他语言的社区翻译文章。下面是阿拉伯语、中文、荷兰语、法语、德语、印地语、印尼语、意大利语、日语、葡萄牙语、【BR】、俄语、西班牙语和土耳其语(如果你愿意自愿做翻译,请阅读此处。)
播客
视频
29min talk about ethics and responsibility in AI
19min talk introducing Decision Intelligence
15min talk explaining Google Cloud’s ML offerings in terms of making pizza. If you’ve already watched one of the videos above, start at 5:25.
感谢阅读!YouTube 课程怎么样?
哇!你一直坚持到最后吗?耐力挑战成功了!你已经准备好迎接速度挑战了…你能在 5 秒钟内鼓掌几次?😃
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
数据科学课程从零开始 2018(第一部分)
由于我的药学背景,我不具备数据科学家所需的任何技术知识,在此之前我甚至不知道线性代数的存在。那时,我真的不太可能一头扎进很酷的数据科学领域。我被自己知识的匮乏所压倒,我认为一个全面的课程会真正帮助我,或者像我这样的人。
好消息是,网上并不缺少数据科学课程。坏消息是,我既没有收入也没有时间去试驾每一门课程,我需要一门适合我的课程。
根据我缺乏的技能开发定制课程是下一个最好的选择。我从工作门户网站中提取技能,查阅了班级中心的大量评论,结合社区的建议,几个版本之后,我自己的数据科学课程形成了。
这是我展示我的课程和提供这些课程的个人评论的系列的第一部分。
免责声明 :遵循课程并不能保证成功。我也不是来自任何有资格出版我自己的课程的学术机构。本课程的目的是为您提供数据科学入门指南,即使您缺乏技术知识。
数据科学导论
统计数据
概率
微积分
线性代数
Python 编程
机器学习
深度学习
学习如此复杂的题目没有硬性规定。在线学习的美妙之处在于,你可以选择你需要的和让你兴奋的东西。
对于这个系列的第 1 部分,我将回顾我所学的数学和 python 基础课程。请注意,这些是我的个人意见,可能会也可能不会引起你的共鸣。不管怎样,我们走吧。
https://www.udemy.com/datascience/
数据科学导论
我想特别提到基里尔·叶列缅科和超级数据科学团队的数据科学 A-Z。这是我第一次参加数据科学领域的课程,基里尔·叶列缅科做得非常好,激起了所有数据科学爱好者的兴趣。不要期望从本课程中学到任何工具或技术技能,而是欣赏更大的画面基里尔·叶列缅科试图描绘,他将带你了解一个标准数据科学项目的整个工作流程。
您可以使用一些数据集,完成简单的任务,如数据清理、建模、模型选择、基本 SQL 和数据表示。这是数据科学入门课程中最完整的内容,会让你渴望更多。此外,本课程也是对你的现实检验。如果这不是你作为数据科学家所期望的,也许追求数据科学并不是你的最佳选择。总体而言,如果您对数据科学家的角色仍有疑问,建议您这样做。
统计数据
继续,机器学习所需的数学基础。您可能已经意识到我包含了来自 MITx 的统计和数据科学 MicroMasters 程序,但这完全取决于您的偏好。没有这个项目你也能做得很好。对于统计和概率,我正在使用该计划的课程,但我可以列出一些其他的替代建议。
除了它们经常在我搜索的时候出现之外,我没什么好评论的。下面的评论让我知道这是不是一个好的选择。MITxMITx的统计基础还没有开始他们的课程,所以我将把它留到另一天。
可能性
现在我只想说,概率——不确定性和数据的科学是一门极好的课程。这是我带过的最有活力、要求最高的 MOOC。该课程估计在 16 周内每周要花费大约 12 个小时的努力,但我很容易就完成了每周两倍的时间。有每周到期的问题集和每 4 周一次的定时考试,迫使你经常重温这些材料。一句忠告,认真对待前提条件。在学习新的深入概念时,你不会想与基本的微积分作斗争。做好心理准备,把你的大部分空闲时间花在习题集上,但我保证这是值得的。这门课程可能是你在数据科学中唯一需要的概率课程。甚至有人会说,你不需要这么高级的概率。这可能是真的,但是让你自己沉浸在一门数学繁重的课程中,会让你更好地为你将来会遇到的所有数学符号做好准备,无论是来自机器学习算法还是阅读未来的科学研究论文。结论:如果你有时间和决心,这是一门优秀的课程,强烈推荐。
你可以免费旁听课程,不需要证书,否则,证书费用为 300 美元。如果您负担不起,edX 将提供高达 90%的经济资助。
多元微积分和线性代数
我将它们放在一起提及,因为我在这些方面几乎使用了相同的资源。Coursera 和 Khan academy 的机器学习数学互为补充,为您提供足够的基础知识来理解机器学习算法。坦率地说,与课程中的其他课程相比,它们相形见绌。《机器学习的数学》旨在介绍机器学习中微积分和线性代数的各种实现,但短片和练习作业的缺乏使概念难以坚持,难以理解,并让您比以前更加困惑。
这就是可汗学院的用武之地。Khan Academy 为机器学习的数学中引入的每个概念提供了详细的解释。通过关注可汗学院 Coursera 课程引入的主题,它大大减少了微积分和线性代数所需的时间。对于我们在数据科学中的应用,有些主题比其他主题更重要。可汗学院的主要缺点是缺乏任务,但不要担心,因为当你进入机器学习算法时,你会得到大量的练习。
可汗学院对所有人都是免费的,你可以免费旁听 Coursera 课程。
https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw
这里还要特别提一下。3Blue1Brown 的《线性代数精要》在为常见的线性代数运算提供直观性方面做得很好。这一系列 youtube 短视频绝对值得一看,不会占用你太多时间。
麻省理工学院吉尔伯特·斯特兰教授的线性代数课程也很受欢迎。我还没有浏览过这些材料,但是考虑到矢量化实现在机器学习中的重要性,我一定会在不久的将来参观这个课程。
Python 编程
为什么是 python?对我来说,与 R 相比,我喜欢它是一种通用语言,语法对我来说也很直观,很容易掌握。
来自 Udemy 的完整 Python 训练营在教授语法、面向对象编程方面做得相当不错,并且提供了 Jupyter 笔记本作业来练习。这对初学编程的人来说是很棒的,Jupyter 笔记本作业是一个加分项。开始习惯 Jupyter 笔记本,因为它无疑是我们工具箱中最重要的工具之一。对于那些有编程经验的人来说,你最好阅读官方的 python 文档。
另一方面,MITx 的两门课程(Python 中的计算机科学和编程入门,计算思维和数据科学入门)都值得仔细研究。编程语言很像自然语言,需要练习。每周的习题集、测验和考试给你充分的练习机会,评分员会对你的代码提供即时的反馈。计算思维和数据科学也涉及数据科学技术,如优化算法、蒙特卡罗模拟、随机漫步和其他有用的技能。对我来说,这是最接近真实课堂环境的了。完成每个问题集后的成就感强化了你的理解,激励你走得更远。
再次强调,旁听 MITx 课程是免费的,但是每张证书的费用是 75 美元,并且有资格获得 edX 90%的经济资助。
这就是这个系列的全部内容。接下来,我将讨论机器学习和深度学习的课程。
我个人的建议是处理这些课程
- 好好计划你的时间表。edX 上提供的大多数课程都是教师指导的,这意味着你的作业有评分的最后期限
- 以 1.5 到 2 倍的速度观看视频
- 记笔记
- 如果你没有马上理解这个概念,不要太担心,当你应用这些知识的时候,重新审视它们
- 申请,申请,申请。做一些项目,研究有趣的数据集,在 kaggle 上竞争
“我没有特殊才能。我只是强烈好奇。”
— 阿尔伯特·爱因斯坦
这是我的 Github 链接,里面有更多资源和一些数据科学电子书的可下载 pdf 文件https://github.com/Benlau93/Data-Science-Curriculum
对于该系列的第 2 部分,点击此处。
数据科学解密:什么是样条?
本周在德国实验室的一次会议上,我有了一个认识。我们没有使用正常人的语言。有趣的是,数学术语是如此神秘,而事实上,它们(通常)指的是不那么复杂的东西!
本周,术语是**拟合一条基本样条,**起初让我大吃一惊。让我们仔细分析一下。
**免责声明:在你进一步阅读之前,这篇文章中没有数学。我将尝试研究样条,使它们在更简单的术语中有意义。如果你正在寻找一个已被证实的样条的数学定义, 查阅本章 。 **
合适才有意义
“适合”这个词并不可怕。我们一直在用这个词!试衣、在电梯里试衣、穿旧衣服——仅举几例……令人惊讶的是,数学术语“试衣”的意思几乎是一样的。
比方说,你正在购买一些新的自行车鞋。你怎么知道你有一个“完美的契合”?如果鞋子太松,你的脚会扭动。如果鞋子太紧,你会有意外的拇趾囊肿。很难找到完美的契合。你可能不得不以某种方式妥协,在太紧和太松之间找一双鞋。
现在想象一下图表上的一堆数据点。假设你想找到一条符合这些点的线。“拟合曲线”基本上意味着找到一条尽可能接近数据的曲线。这很像找到一双完美的鞋子。你的数据点(你的脚)通常是独一无二的,你穿的线(鞋子)看起来很可能与数据不完全一样。
看看这条符合一组数据的线:
请注意,最终曲线并没有穿过每个数据点。相反,它找到了一个很好的中间地带。这个中间地带是由你选择适合的数学函数/算法决定的。听起来很奇怪,你可以说今天你通过一个可变阻尼因子的高斯-牛顿算法探索了数据拟合曲线。或者你可以说你找到了一双新的自行车鞋。
样条是…
这是什么…一束仙人掌刺?
可惜不是。😦
维基百科的定义:“由多项式分段定义的函数”也没有多大帮助。这个定义假设你知道一个多项式分段函数意味着什么。这可能是下一篇数据科学解密文章的好主题(是的,我希望做得更多!).
让我们用更简单的术语来说。你用过 PowerPoint 上的线条工具吗?如果不是,这基本上可以概括为:
原来,PowerPoint 知道怎么做样条!样条曲线将曲线加在一起,形成连续的不规则曲线。使用此工具时,每次点击都会为线条创建一个新区域,或一个线段。每次点击还会创建一个所谓的控制点,或者决定曲线形状的点。
这就是样条的要点。他们用不规则的数据点创建平滑的曲线——很酷,对吧?!
好了,基础样条
基本样条只是一种样条形式。根据您使用的类型,样条曲线的外观可能会有所不同。这是有道理的——有许多不同的方法可以通过数据点形成一条线。
以这张图片为例:
每条彩色线都是不同类型的样条线。红线是一种基本样条!
为什么要用基样条拟合曲线?
这个问题有点超出了本文的范围。本质上,当您想要将一堆点拟合为平滑曲线,但不确定数据点的基本结构是什么时,这些类型的线非常有用。
数据有时是不可预测的:
基础样条有助于理解它!