学习如何在 5 分钟内将数据读入熊猫数据框
从不同来源提取数据
概观
据说数据科学家花费 80%的时间对数据进行预处理,所以让我们深入研究数据预处理管道,也称为 ETL 管道,让我们找出哪个阶段花费的时间最多。在这篇博文中,我们将学习如何从不同的数据源中提取数据。让我们来看一个真实的数据集,这样更容易理解。
本课使用了世界银行的数据。数据来自两个来源:
数据文件的类型
- CSV — CSV 代表逗号分隔值。这是文件的外观
id,regionname,countryname,prodline,lendinginstr
P162228,Other,World;World,RE,Investment Project Financing
P163962,Africa,Democratic Republic of the Congo;Democratic Republic of the Congo,PE,Investment Projec
让我们用 pandas 加载这个文件。
import pandas as pd
df_projects = pd.read_csv('../data/projects_data.csv')#ERROR:
#/opt/conda/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2785: DtypeWarning: Columns (44) have mixed types. Specify dtype option on import or set low_memory=False.interactivity=interactivity, compiler=compiler, result=result)
我们将得到一个 DType 警告错误。基本上,pandas 会计算出我们文件的数据类型,并适当地读取它们,但是我们的一个列有多种数据类型,因此会出现警告错误。我们可以在读取时传递字符串的数据类型。请参考熊猫 文档 阅读更多。
df_projects = pd.read_csv('../data/projects_data.csv',dtype=str)
输出:
让我们阅读另一个 CSV 文件:
df_population = pd.read_csv("../data/population_data.csv")
# ParserError: Error tokenizing data. C error: Expected 3 fields in line 5, saw 63
看起来这个 CSV 文件有问题。让我们检查一下里面的东西。这里,如果文件很小,您可以使用记事本/excel 直接打开 CSV 文件,也可以使用下面的 python 代码:
with open("../data/population_data.csv") as f:
lis = [line.split() for line in f] # create a list of lists
#print(lis)
for i, x in enumerate(lis): #print the list items
print ("line{0} = {1}".format(i, x))#Output:line0 = ['\ufeff"Data', 'Source","World', 'Development', 'Indicators",']
line1 = []
line2 = ['"Last', 'Updated', 'Date","2018-06-28",']
line3 = []
line4 = ['"Country', 'Name","Country', 'Code","Indicator', 'Name","Indicator', 'Code","1960","1961","1962","1963","1964","1965","1966","1967","1968","1969","1970","1971","1972","1973","1974","1975","1976","1977","1978","1979","1980","1981","1982","1983","1984","1985","1986","1987","1988","1989","1990","1991","1992","1993","1994","1995","1996","1997","1998","1999","2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017",']
看起来 CSV 文件的前 4 行已损坏。因此,我们可以通过使用skip prows参数跳过前 4 行。
df_population = pd.read_csv("../data/population_data.csv",skiprows=4)
输出:
2。JSON —它是一种带有键/值对的文件格式。
[{"id":"P162228","regionname":"Other","countryname":"World;World","prodline":"RE","lendinginstr":"Investment Project Financing"},{"id":"P163962","regionname":"Africa","countryname":"Democratic Republic of the Congo;Democratic Republic of the Congo","prodline":"PE","lendinginstr":"Investment Project Financing"},{"id":"P167672","regionname":"South Asia","countryname":"People\'s Republic of Bangladesh;People\'s Republic of Bangladesh","prodline":"PE","lendinginstr":"Investment Project Financing"}]
谢天谢地,熊猫有直接读取 JSON 的功能。
import pandas as pd
df_json = pd.read_json('population_data.json',orient='records')
其他方法:
import json# read in the JSON file
with open('population_data.json') as f:
json_data = json.load(f)# print the first record in the JSON file
print(json_data[0])
- XML —另一种数据格式叫做 XML(可扩展标记语言)。至少在格式方面,XML 和 HTML 非常相似。
<ENTRY>
<ID>P162228</ID>
<REGIONNAME>Other</REGIONNAME>
<COUNTRYNAME>World;World</COUNTRYNAME>
<PRODLINE>RE</PRODLINE>
<LENDINGINSTR>Investment Project Financing</LENDINGINSTR>
</ENTRY>
<ENTRY>
<ID>P163962</ID>
<REGIONNAME>Africa</REGIONNAME>
<COUNTRYNAME>Democratic Republic of the Congo;Democratic Republic of the Congo</COUNTRYNAME>
<PRODLINE>PE</PRODLINE>
<LENDINGINSTR>Investment Project Financing</LENDINGINSTR>
</ENTRY>
有一个名为 BeautifulSoup 的 Python 库,它使得读入和解析 XML 数据变得更加容易。以下是文档链接:美汤文档
# import the BeautifulSoup library
from bs4 import BeautifulSoup# open the population_data.xml file and load into Beautiful Soup
with open("population_data.xml") as fp:
soup = BeautifulSoup(fp, "lxml") # lxml is the Parser type
让我们看看汤是什么样子的:
<html><body><p><?xml version="1.0" encoding="utf-8"?>
<root xmlns:wb="http://www.worldbank.org">
<data>
<record>
<field key="ABW" name="Country or Area">Aruba</field>
<field key="SP.POP.TOTL" name="Item">Population, total</field>
<field name="Year">1960</field>
<field name="Value">54211</field>
</record>
<record>
<field key="ABW" name="Country or Area">Aruba</field>
<field key="SP.POP.TOTL" name="Item">Population, total</field>
<field name="Year">1961</field>
<field name="Value">55438</field>
</record>
如何将 XML 作为数据帧读取?
data_dictionary = {'Country or Area':[], 'Year':[], 'Item':[], 'Value':[]}for record in soup.find_all('record'):
for record in record.find_all('field'):
data_dictionary[record['name']].append(record.text)df = pd.DataFrame.from_dict(data_dictionary)
df = df.pivot(index='Country or Area', columns='Year', values='Value')df.reset_index(level=0, inplace=True)
基本上,我们需要为每一列或每一行创建一个字典,然后将字典转换为 dataframe。
输出:
- SQL — SQL 数据库使用主键和外键在表中存储数据
要从 SQL 数据库中读取数据,您需要将数据存储在数据库中。要了解如何将 CSV 转换为 SQL DB,请阅读这篇 博客 。
SQLite3 对熊猫
import sqlite3
import pandas as pd# connect to the database
conn = sqlite3.connect('population_data.db')# run a query
pd.read_sql('SELECT * FROM population_data', conn)
对熊猫的 SQLAlchemy
import pandas as pd
from sqlalchemy import create_engineengine=create_engine('sqlite:home/workspace/3_sql_exercise/population_data.db')
pd.read_sql("SELECT * FROM population_data", engine)
5.从网络中提取数据是一个非常累人的过程。但是很多公司已经通过 API 公开了他们的数据。API 通常以 JSON 或 XML 格式提供数据。有些 API 是公共的,您不需要登录,而有些是私有的,用户需要生成一个 API 密钥。
import requests
import pandas as pdurl = '[http://api.worldbank.org/v2/countries/br;cn;us;de/indicators/SP.POP.TOTL/?format=json&per_page=1000'](http://api.worldbank.org/v2/countries/br;cn;us;de/indicators/SP.POP.TOTL/?format=json&per_page=1000')
r = requests.get(url)
r.json()
不同网站的 API 调用是不同的,这里我们使用请求库来获取 JSON 格式的数据。在这里 阅读更多关于不同 API 结构的信息
了解如何使用熊猫在地方参数一劳永逸
对流行的 pandas 函数何时使用、何时不使用 inplace 参数的快速解释。
简介
我注意到初学者,有时甚至是更高级的数据科学家在操作数据帧时,对如何在 pandas 中使用 inplace 参数感到困惑。
更有趣的是,我没有看到太多解释这个概念的文章或教程。不知何故,它似乎是假定的知识或不言自明的概念。不幸的是,这并不是对每个人都如此简单,因此本文试图解释什么是 inplace 参数以及如何正确使用它。
使用现场参数的功能
让我们来看一些使用代替的函数的例子:
- 菲尔娜
- 德罗普纳()
- 排序值()
- 重置索引()
- 排序索引()
- 重命名()
我已经从头开始创建了这个列表,可能有更多的函数使用代替作为参数。我并不记得所有的函数,但是几乎所有将作为参数的 pandas DataFrame 函数都会以类似的方式运行。这意味着在处理这些问题时,你将能够运用你将在本文中学到的同样的逻辑。
创建一个样本数据框
为了说明在位置的用法,我们将创建一个样本数据框。
import pandas as pd
import numpy as np
client_dictionary = {'name': ['Michael', 'Ana', 'Sean', 'Carl', 'Bob'],
'second name': [None, 'Angel', 'Ben', 'Frank', 'Daniel'],
'birth place': ['New York', 'New York', 'Los Angeles', 'New York', 'New York'],
'age': [10, 35, 56, None, 28],
'number of children': [0, None, 2, 1, 1]}
df = pd.DataFrame(client_dictionary)
df.head()
我们创建了一个具有五行的数据框,其中包含以下各列:姓名、第二个名字、出生地、和子女数量。注意年龄、姓氏、和子女列(NaNs)有部分数值缺失。
我们现在将演示 dropna()函数如何与 inplace 参数一起工作。因为我们想要检查两种不同的变体,所以我们将创建原始数据框的两个副本。
df_1 = df.copy()
df_2 = df.copy()
dropna()with in place = True
让我们从 inplace=True 的变体开始。下面的代码删除所有缺少值的行。
df_1.dropna(inplace=True)
如果你在 Jupyter 笔记本上运行这个,你会看到这个单元没有输出。这是因为 inplace=True 的函数不会返回任何内容。它使用所需的操作修改现有的数据帧,并在原始数据帧上“就地”执行。
如果您在数据框上运行 head()函数,您应该会看到两行被删除。
df_1.head()
dropna() with inplace = False(默认)
现在让我们用 inplace = False 运行相同的代码。注意,这次我们将使用 df_2 版本的数据帧。
df_2.dropna(inplace=False)
如果你在 Jupyter notebook 中运行这段代码,你会看到有一个输出(上面的截图)。inplace = False 的函数返回删除了行的数据框。
记得当在位被设置为真时,没有返回任何东西,但是原始数据帧被修改。
那么这次原始数据帧会发生什么情况呢?让我们调用 head()函数来检查。
df_2.head()
原数据框不变!发生了什么事?
使用 inplace=False 时,将创建并更改新对象,而不是原始数据框。如果想要更新原始数据框以反映被删除的行,则必须将结果重新分配给原始数据框,如下面的代码所示。
df_2 = df_2.dropna(inplace=False)
但是等等!这正是我们在使用 inplace=True 时所做的事情。是的,这最后一行代码相当于下面一行:
df_2.dropna(inplace=True)
后一种方法更优雅,它不会创建一个中间对象,然后将这个中间对象重新分配给原始变量。它直接更改原始数据框,因此,如果您打算更改原始数据框,则首选它。
简单,不是吗?
那么,为什么会有这么多的错误呢?我不确定,可能是因为有些人还不明白如何正确使用这个参数。让我们来看看一些常见的错误。
图片来自pix abaySyaibatul Hamdi
常见错误
- 对数据帧的一部分使用 in place = True
我已经注意到好几次了。让我们回到本文开头的数据框示例。有些自由列没有值:ssecond name、age 和 number of children 。
如果我们只想从第二个姓名和年龄列中删除 None,并保持孩子数量列不变,我们该怎么办?
我见过有人尝试做以下事情:
df[['second name', 'age']].dropna(inplace=True)
这可能是你不想做的事情!
事实上,这应该抛出以下警告。
显示这个警告是因为熊猫设计师很好,他们实际上试图警告你不要做你可能不想做的事情。代码正在更改只有两列的数据帧切片,而不是原始数据帧。这是因为您选择了数据帧的一个切片,并将 dropna()应用于这个切片,而不是原始数据帧。
为了纠正它,在带有子集参数的整个数据帧上使用 dropna()。
df.dropna(inplace=True, subset=['second name', 'age'])
df.head()
这将导致在的第二个名字和的年龄列中有空值的行从数据框中被删除。
- 将变量值赋给 inplace = True 的结果
这个我也看过好几次了。
df = df.dropna(inplace=True)
这也是你永远不应该做的事情!你只是把 None 重新分配给 df 的值。请记住,当您使用 inplace=True 时,不会返回任何内容。因此,该代码的结果将不会给 df 赋值。
总结
我希望这篇文章为你揭开了中参数的神秘面纱,你将能够在你的代码中正确地使用它。快乐的数据框操作!
原载于 aboutdatablog.com: 学习如何一劳永逸地使用熊猫原地参数,2020 年 7 月 15 日。
PS:我正在 Medium 和上撰写深入浅出地解释基本数据科学概念的文章。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入。**
下面还有一些你可能喜欢的帖子
** [## Pandas 数据操作函数:apply()、map()和 applymap()
以及如何在熊猫身上正确使用它们…
towardsdatascience.com](/pandas-data-manipulation-functions-7b3519fc1370) [## 9 熊猫有效数据分析的可视化技术
学习如何使用折线图、散点图、直方图、箱线图和其他一些可视化技术
towardsdatascience.com](/9-pandas-visualizations-techniques-for-effective-data-analysis-fc17feb651db) [## Jupyter 笔记本自动完成
数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…
towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c) [## 9 大 Jupyter 笔记本扩展
改进笔记本电脑功能,提高您的工作效率
towardsdatascience.com](/top-9-jupyter-notebook-extensions-7a5d30269bc8)**
学习线性代数的机器学习从最好的
ML 和 DS 学习线性代数的顶级免费资源
图像由像素生成
介绍
大约 4、5 年前,我坐在一堂数学课上,老师第一次介绍向量的话题。
“矢量是既有方向又有大小的线段.”
这时候我以为我已经永远不再学数学了。在学校,每当老师介绍一些大的数学话题时,他们总是说这个概念在现实生活中非常重要,我应该学习它。我从不问为什么,只是顺其自然。原因是我真的很喜欢数学,擅长数字。我甚至参加了一些数学竞赛,赢了一些。
但是当涉及到向量时,我就是不明白尖尖的线怎么会在现实生活中有应用(我不会责怪任何人不解释)。那时候,学这样的东西似乎很荒唐,我对数学失去了兴趣。
直到今年,我从未见过我的数学知识在现实生活中的应用。然而,当我决定学习计算机科学并发现数学是我感兴趣领域的基石——机器学习时,事情发生了变化。
机器学习应该什么时候学线性代数?
机器学习由几种适合不同现实生活问题的算法组成。任何一个有扎实编程基础的人都可以利用现成的工具、库和模型成为一名优秀的机器学习工程师。但是如果你想成为这个领域的真正专家,你就不能逃避学习线性代数的一些概念。
任何机器学习算法,尤其是深度学习的掩盖下发生的所有魔法,大多是线性代数数学。所以,在我开始学习 ML 之前,很多人都坚信线性代数是一个很大的先决条件。不只是线性代数,我也碰到很多帖子说多元微积分和 PCA 也很重要,不容忽视。我想成为一名“专业人士”,所以我认真考虑了这些建议,并在 Coursera 上找到了一门教授上述所有内容的课程。还有…大错特错!
我读到的所有东西都说数学很重要,但它们从没说过什么时候。事实证明,在你开始研究复杂的算法和解决实际问题之前,ML 有太多的东西要学。谢天谢地,在我学完一些线性代数并准备转向多元微积分的时候,我发现了这个真理。
所以,我的建议是这样的:刚开始不用数学就进入学习机器学习或者数据科学。无论何时开始学习算法,都要尽可能地学习每一个算法。如果你不理解背后的数学,那就开始学习数学课程,填补你的知识空白。这就是你进步的方式,边做边学。不要犯这样的错误,在你还不知道它有什么用之前就去学习。否则,在你开始应用它们之前,你会被烧坏几次,忘记你的大部分知识。
现在,正如承诺的那样,让我们继续学习线性代数的实际资源。
3 蓝色 1 棕色,线性代数播放列表
我们名单上的第一位是 YouTube 传奇人物格兰特·桑德森,他是 YouTube 频道 3Blue1Brown 的创始人。他用 Python 写的一个包将数学概念形象化,如此美丽,你会爱上他的视频。
他的线性代数 播放列表只包含了线性代数的 15 个章节,然而,却在 YouTube 上获得了近 2000 万的浏览量。他的所有视频都旨在给出每个数学概念背后的完整直觉,不会让你对复杂的计算细节感到厌烦。
他使用 2D 和 3D 动画的解释是最高质量和难忘的。这对于线性代数案例特别有用,因为你将会处理大量的向量和线性变换,这些都是不能也不应该用纸笔来教授的主题。要掌握线性代数,你需要每个题目的几何直觉,然后,它的代数表示。
总而言之,格兰特·桑德斯给了数学界它所需要的视觉元素,此外,我喜欢他的视频和 pi 学生的配乐。😃
特雷福·巴泽特,线性代数全教程
接下来是特雷福·巴泽特教授的线性代数完整 YouTube 课程。他是辛辛那提大学的数学教授。他在 YouTube 上关于线性代数的课程是视觉解释和通过定义明确的例子进行教学的完美结合。
他首先用视觉动画教授每个主题,并展示一般公式和计算方法。然后通过解题进一步强化知识,不用复杂的字母和符号,而是用实际的矩阵和向量。你可能会惊讶,有多少教师没有超越我们都讨厌的混乱公式。
可汗学院,线性代数播放列表
最后但同样重要的是,我们还有另一位著名的教育家和在线导师萨尔·汗——汗学院的创始人。他在 YouTube 或他的网站上的线性代数 播放列表可以被认为是对线性代数的深入钻研。
有超过 140 个视频,几乎所有的视频都至少持续 15 分钟。他通过理论和例子很好地解释了每个主题。他还为线性代数中的许多主题提供了证明。我不建议观看他的所有视频,因为并非所有视频都与机器学习有关。
但是如果你想要一个系统的学习线性代数的方法,并完全掌握它的基础知识,这是一个学习的好地方。
我应该选择哪一个?
我的建议是不要选择一个,而是结合使用这三个。其中任何一个都不能涵盖你需要的所有主题。我所做的是观看 3B1B 中的一个章节,并观看其他两个章节中相应的主题视频。这样我就有了我所需要的视觉直觉,以及所有缺少的计算信息和它们在例子中的应用。
使用 scikit-learn 和 NBA 数据学习线性回归:体育数据科学
使用 Python 对 NBA 球员的真实数据进行实际线性回归,可视化结果和学习(包括数据和代码)
用 Python 构建 NBA 球员表现模型(图片由作者提供)
数据科学为其从业者实现了许多非常惊人的任务,并在许多方面从小到大改变了我们的生活。当企业预测产品需求时,当公司发现在线欺诈交易时,或当流媒体服务推荐观看内容时,数据科学通常是实现这些创新的润滑油。
这些类型的数据科学创新基于回归分析,也就是说,它们是关于理解输入变量和输出变量之间的关系。
与分类分析一样,回归是两种基本类型的数据问题之一,了解它如何工作以及如何执行它们是数据分析和数据科学的重要组成部分。
因此,我想在这篇文章中展示如何使用回归分析来识别数据中的模式并用于预测目的。首先,让我们从简单的线性回归技术开始,看看它们能教会我们什么。
我们将构建一个简单的模型来预测 NBA 球员的描述性统计数据,称为 Box-Plus-Minus (BPM) 。
来自关于 BPM —图片:Basketball-Reference.com
BPM 旨在衡量球员的贡献,它基于球员的统计数据、位置和球队的表现。
在这种情况下,我们将仅基于每个玩家的*个人统计数据来构建该模型。*因此,该模型不仅要估计 BPM 如何与个人统计数据相关,还要估计个人统计数据如何与集体团队绩效相关,此处未包括。
最后,在我们建立了一个模型之后,我们将查看哪些数据点形成了异常值/高误差点,并讨论这在该模型的上下文中可能意味着什么。
准备
接下来,安装几个软件包— numpy
、pandas
、sklearn
(scikit-learn),还有plotly
和streamlit
。用一个简单的pip install [PACKAGE_NAME]
安装每个(在您的虚拟环境中)。
这篇文章的代码在我的 GitHub repo here (作为data_predict_bpm.py
)上,所以你可以下载/复制/叉走你喜欢的内容。
哦,这是我写的关于使用 NBA 数据的一系列数据科学/数据分析文章的一部分。所有的钱都会去回购,所以你要睁大眼睛!(这是我之前写的一篇关于可视化数据集进行数据探索的文章
如果您正在跟进,请使用以下内容导入密钥库:
import numpy as np
import pandas as pd
import sklearn
import plotly.express as px
import streamlit as st
我们准备好出发了。
构建玩家模型——从汤到坚果
数据预处理
大多数数据科学项目都是从乏味的任务开始的,比如项目范围、数据收集和数据清理。幸运的是,我们正在使用的数据集将让我们绕过这一切。
尽管如此,它并没有完全减轻我们对预处理的所有责任。
在预处理中,就像在每一步一样,我们需要记住我们要达到的目标。在这种情况下,我们正在构建一个使用玩家统计数据来预测 BPM 的模型。
因为 BPM 是一个“比率”统计,所以使用与每场比赛相关的统计是有意义的。因此,让我们加载每场比赛的统计数据集(player_per_game.csv
)并检查它。(有关使用交互式 web 应用程序探索该数据集的文章,请在此处查看我的文章。)
查看数据,我们看到一些玩家有异常数据。这里有一个例子,绘制球员在两分球和三分球上的命中率。
请注意由于样本量小而导致的数据失真(图片由作者提供)
你会注意到在这张图表中的直的垂直线或水平线中的点群。这些都是小样本的伪影,导致像 0%、60%或 100%这样的百分比。)精度。一名球员 3 投 100 中,整体命中率 80%。这些数据点不太可能代表玩家的实际能力,并且可能会污染我们构建的任何模型。
所以让我们过滤掉这些玩家。我们应该怎样做呢?很明显,我们可以过滤掉具有一定准确度的球员,但这不是根本问题——这是症状,不是原因。原因是某些球员的样本量很小。
考虑到这一点,让我们用一个统计数据来代表每个球员产生这些统计数据的机会,也就是总的上场时间。
上场时间的分布如下所示:
分钟直方图(图片由作者提供)
因此,让我们按照至少 500 分钟的播放时间来过滤数据帧。
df = df[df["mp"] > 500]
数据现在应该看起来“干净”多了。你自己看看吧。
因为我们正在构建一个线性回归模型,所以让我们保持一些连续的变量来简化事情。
cont_var_cols = ['g', 'mp_per_g', 'fg_per_g', 'fga_per_g', 'fg3_per_g', 'fg3a_per_g', 'fg2_per_g', 'fg2a_per_g', 'efg_pct', 'ft_per_g', 'fta_per_g', 'orb_per_g', 'drb_per_g', 'trb_per_g', 'ast_per_g', 'stl_per_g', 'blk_per_g', 'tov_per_g', 'pf_per_g', 'pts_per_g', 'mp']
cont_df = df[cont_var_cols]
将所有最新的数据放在一起(为了实时可视化,添加了一点 Streamlit),我们得到:
数据探索
让我们暂停一下,检查各种输入变量和目标变量(BPM)之间的相关性。
首先,场均得分和 BPM 之间:
场均得分和 BPM 之间的相关性——非常非常好!(图片由作者提供)
场均助攻呢?
场均助攻与 BPM 的相关性——还不错!(图片由作者提供)
现在,并不是所有的统计数据都与目标相关联—请看下一个统计数据:
场均助攻和 BPM 之间的相关性——可能接近于零(图片由作者提供)
这看起来像是典型的非相关关系!不要相信我的话,看看这个教科书上的例子:
相关性示例表——中上图是否让你想起了什么?(图片:维基百科)
这很直观,对吗?为什么一个球员的平均个人犯规次数与他们的能力有任何关系,除了他们在球场上花了多少时间?即便如此,我认为这种相关性还是很弱。
接下来,我们将看看单个特征的规模。我们可以将数据列的最小、平均、最大和标准偏差可视化,如下所示:
feat_desc = cont_df.describe()[cont_var_cols].transpose().reset_index().rename({'index': "var"}, axis=1)
feat_fig = px.bar(feat_desc[['var', 'mean', 'std']].melt(id_vars=['var']), x="var", y="value", color="variable", barmode="group")
各种特征的统计描述符—范围由一个统计数据决定!(图片由作者提供)
即使在对数标度中,它们也是极其易变的!(图片由作者提供)
这里有一个相当大的范围。这可能会导致一些变量对模型的影响超过其他变量,因此调整每个输入变量通常是一种好的做法。
所以让我们将数据标准化。Scikit-learn 有一个模块preprocessing.StandardScaler()
,它基本上使这个过程一步完成。像这样实例化一个scaler
:
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(cont_df)
数据可以缩放为:
X = scaler.transform(cont_df)
为了确保缩放有效,我们可以再次绘制缩放后的变量,从而得到这个极其无聊的图!
成功的攀登,还是一堵墙的轮廓?(图片由作者提供)
现在我们(终于)准备好开始构建一些模型了。
给我做个模型
作为第一步,我们将数据分成两组—一组训练集和一组测试集。让我们保持简单,现在使用 80/20 规则。输入变量可以这样分割:
X_train, X_test = model_selection.train_test_split(X, train_size=0.8, random_state=42, shuffle=True)
目标变量是这样的:
Y = df["bpm"].values
Y_train, Y_test = model_selection.train_test_split(Y, train_size=0.8, random_state=42, shuffle=True)
现在我们在这里,scikit-learn 的神奇之处在于,实际应用一个特定的算法非常简单。
对于随机梯度下降回归器,建立如下模型:
mdl = linear_model.SGDRegressor(loss="squared_loss", penalty="l2", max_iter=1000)
mdl.fit(X_train, Y_train)
然后用以下公式进行预测:
Y_test_hat = mdl.predict(X_test)
我们可以将预测与基本事实(实际 Y 值)进行比较,如下所示:
test_out = pd.DataFrame([Y_test_hat, Y_test], index=["Prediction", "Actual"]).transpose()
val_fig = px.scatter(test_out, x="Prediction", y="Actual", title="Stochastic Gradient Descent model prediction of BPM vs ground truths")
SDG 模型预测与实际值(图片由作者提供)
这是个不错的结果。我们犯了什么错误?让我们以 MSE(均方误差)来计算它,这又是用 sklearn 的一行计算:
from sklearn import metrics
mse = metrics.mean_squared_error(Y_test, Y_test_hat)
使用随机梯度下降回归器,MSE 值为:1.19。
那是我们能做的最好的吗?有可能,但也可能没有。有很多很多算法可以尝试。Scikit-learn 文档为提供了这份线性模型指南,这份指南可能值得一读,或者至少提供了一份方便的参考。他们还提供这个地图来帮助选择一个估计器(不仅仅是线性模型,但是它们在那里)
现在,让我们尝试几个不同的回归变量,看看它们的表现如何:
试一个岭回归模型:
mdl = linear_model.Ridge(alpha=.5)
mdl.fit(X_train, Y_train)
岭回归模型预测值与实际值(图片由作者提供)
支持向量回归模型:
mdl = svm.SVR(kernel='rbf', degree=3)
mdl.fit(X_train, Y_train)
支持向量回归模型预测值与实际值(图片由作者提供)
你可以看到他们的行为都略有不同。
MSE 值为:
- 随机梯度下降:1.19
- 岭回归:1.17
- 支持向量回归:0.9
组合在一起的代码如下所示:
在我们的简单测试中,支持向量回归对这组数据表现最好。这当然没有多大意义——我没有做过任何超参数调优,只使用了相对较小的数据集,并且使用了一个测试/训练集分割。但希望这足以让你大致了解。
这就是用 Python 构建线性回归模型的基础——如果你对机器学习相对陌生,并且认为它比你想象的要简单——我同意。如今,实现机器学习算法很容易。
对于深度学习等更复杂的方法也是如此,我们将在后面看到。对我来说,就像在其他技术领域一样,关键在于问题的表述。所以我鼓励你投入进去,看看你还能做些什么。
额外讨论——这里的错误意味着什么吗?
通常,基础事实和模型之间的误差并不意味着什么,除了——这是模型和现实生活样本之间的差异。但有时,误差可能是系统性的,甚至表明模型或输出变量的某些固有特性。
在我们的例子中,回想一下 BPM 是一个与团队绩效相关的统计数据,而模型仅仅来自个人绩效。
所以,我想知道预测(仅基于个人数据)和实际的 BPM 数据之间的差异是否会识别出对球队有额外价值,但没有显示在数据上的球员。
这就是结果。在这里,我只显示了排名靠前的球员(BPM 值为 6 或更高),并根据球员的位置和时代进一步细分了结果。
杰出的玩家,比较预测和实际表现(图片由作者提供)
通过查找 BPM 表现超出模型的最佳季节有:
超额表现者(与我们的模型相比)(图片由作者提供)
相反,这些玩家的实际 BPM 远低于预测。
和…表现不佳者(对比模型)(图片由作者提供)
我的假设是,具有较高“相对价值”统计数据的球员往往是那些让队友变得更好的球员(例如斯蒂芬·库里,因为他的重力,或者迈克尔·乔丹,因为他是迈克尔·乔丹),但另一种解释可能是,这表明那些幸运地拥有伟大队友的球员(例如 2012 年的马努)。
有趣的是,勒布朗·詹姆斯三次出现在名单上,因为他的表现低于他预测的 BPM 数据——随你怎么想。我会注意到,2017 年的骑士队在某种程度上只是一个疲软的东部联盟的 2 号种子,2011 年的热火队是热火队真正团结起来之前的第一年,而 2019 年的湖人队或多或少是勒布朗周围一支球队的一个小垃圾箱。
无论如何,关于篮球方面的事情已经说得够多了——我可能下次再写。我只是想强调错误不仅仅意味着模型和事实之间的差异。
今天到此为止。我希望那是有趣的。我将跟进一些其他机器学习的例子,一些还有深度学习/神经网络模型,这对我来说真的很令人兴奋。
ICYMI,这是我之前写的一篇关于用 Plotly 和 Streamlit 探索数据集的文章:
[## 使用定制的交互式 web 应用程序探索任何数据:体育数据科学
了解如何使用领先的数据可视化工具构建交互式、可重复使用的 web 应用程序进行探索性数据分析…
towardsdatascience.com](/explore-any-data-with-a-custom-interactive-web-app-data-science-with-sports-410644ac742)
在你离开之前——如果你喜欢这个,在推特上打个招呼/关注,或者点击这里更新。
您可能还会对以下内容感兴趣:
[## Plotly Dash 与 Streamlit——哪个是构建数据仪表板 web 应用程序的最佳库?
用于共享数据科学/可视化项目的两个顶级 Python 数据仪表板库的比较——
towardsdatascience.com](/plotly-dash-vs-streamlit-which-is-the-best-library-for-building-data-dashboard-web-apps-97d7c98b938c)
交互式学习机器学习概念
五个免费可用的工具,直观地分解了复杂的机器学习概念
罗斯·斯奈登在 Unsplash 上的照片
机器学习算法如何在引擎盖下工作是许多人不理解的一个方面。一层 CNN 看到了什么?反向传播是如何工作的?层中的权重究竟是如何更新的?这些是我们脑海中反复出现的一些问题。这些概念对于那些想要在将数学方程与理论联系起来的过程中度过一段艰难的时间的初学者来说可能是特别难以理解的。好消息是,一些人理解这种痛苦,并希望提供替代形式的学习。本文汇集了五个这样的工具,它们超越了理论,而是直观地解释了标准的机器学习概念。
1.MLaddict.com
来源:https://www.mladdict.com/
mladdict.com如果你想理解以下四种算法的基本数学概念,这是一个极好的工具:
- 线性回归
- 神经网络
- 循环网络
- q 学习代理
它会在您的浏览器中打开一个模拟器,然后演示算法的每个阶段会发生什么。下面是一个模拟器的演示,展示了如何使用梯度下降算法进行线性回归。
作者视频|内容来自mladdict.com
2.直观解释
来源:mladdict.com
直观解释(EV) 是一个旨在将挑战性的想法直观化的实验。它的灵感来自 Bret Victor 的作品探索性解释。这个网站上最后一篇更新的文章可以追溯到 2017 年,所以你不会找到任何最新的材料,但那里的那些简直太棒了。我在我的一些博客中借用了一些他们的视觉解释,因为他们创作得非常漂亮。下面先睹为快 EV 如何解释主成分分析(PCA)的概念。查看他们网站上其他令人兴奋的作品。
作者视频。来自的内容进行了直观解释(EV)
3.视觉理论
来源:https://seeing-theory.brown.edu/
见理论 是一个提供概率和统计直观介绍的网站。该网站的目标是通过交互式可视化使统计数据更容易获取。该书为以下六个统计概念提供了直观的解释。
- 基本概率
- 复合概率
- 概率分布
- 频繁推理
- 贝叶斯推理
- 回归分析
我们来看看看见论是如何介绍概率论的基本概念的。
作者视频。内容来自 见论
4.R2D3:统计和数据可视化
来源: R2D3:统计和数据可视化
R2D3 是用交互设计表达统计思维的实验。它以结构化的方式提供了机器学习概念的可视化介绍。目前,网站上提供了以下主题:
- 第 1 部分:决策树
- 第 2 部分:偏差和方差
- 在机器学习的世界里设计
- 理解新冠肺炎
下面是你如何可视化决策树如何进行分类
作者视频|内容来自 R2D3
5.CNN 解说者
来源:https://poloclub.github.io/cnn-explainer/
CNN 讲解人 是一个交互式可视化系统,旨在帮助非专家了解卷积神经网络(CNN)。CNN Explainer 是一个结合了 CNN 的模型概述和动态可视化解释的工具,可以帮助用户理解 CNN 的底层组件。 通过跨抽象层次的平滑过渡,我们的工具使用户能够检查低级数学运算和高级模型结构之间的相互作用。
欲了解更多信息,请查看我们的手稿 CNN 解释者:用交互式可视化学习卷积神经网络或尝试使用现场演示这里。下面是如何使用该工具的快速演示。
结论
最后,我们看了五个有用的工具,它们让机器学习和统计概念变得更有趣。一幅画胜过千言万语,这是正确的说法。当复杂的术语以互动的形式呈现时,它们会变得更容易理解。这也有助于降低初学者进入机器学习领域的门槛。
以有趣的方式学习机器
严格的课程让你享受学习。
最近,我收到了一些读者的回复,他们让我写一些关于如何从机器学习/数据科学开始,以及从哪些资源开始是正确的。我犹豫了一下,因为已经有很多关于这个主题的“初学者指南”文章了。
然而,我也注意到,那里的许多文章更像是无穷无尽的在线课程列表的集合。而 乐趣 学习的成分很大程度上被忽略了。此外,来自非技术背景(我第一个学位学的是经济学),我知道放弃有多容易。学习的道路需要大量的 努力 ,大量的 奉献 和 好奇心 。没有捷径可走,但你肯定可以让它变得更有趣、更令人兴奋。在这篇文章中,我试图向你展示一幅最清晰的机器学习(ML)的画面,以及你应该如何从它开始而不被淹没。这是我们的计划:
- 了解机器学习的构建模块;
- 必修基础;
- 学习策略+如何娱乐自己的技巧;
- 如何让知识成为你的?
让我们开始吧。
1.机器学习的基石
机器学习的构建模块可以总结如下:
机器学习的基石。
这肯定不是一个详尽的列表,但你得到的想法。你遇到的所有模型和算法背后都有一些支配性的理论。这是因为机器学习可以从很多角度来看:统计的角度,计算复杂度的角度等等。当你看到一些主要介绍数学定理和证明的 ML 书籍时,不要感到困惑,而其他一些书籍则更注重数据和编程语言的实用性。他们只是从不同的角度看 ML。
来源:https://anacuder.com/o-que-significa-in-a-nutshell/
从这些不同的理论中,我们得出了不同类型的学习模型(线性、决策树、神经网络等。).
然而,为了使模型能够在真实数据集上很好地概括,我们需要采用一些额外的技术(例如,正则化以避免过度拟合,集成方法以减少学习模型中的偏差/方差)。这就是同一款车型的各种变种的来源。例如,添加了一些正则化项的线性回归创建了新类型的模型(例如套索、山脊或弹性网)。决策树也是如此:使用不同的集成方法,我们提出了随机森林、AdaBoost 等。
最后,根据您如何在真实数据集上应用模型,模型可以分为不同的范例。例如,当在标记数据集上训练时,神经网络是监督学习算法。然而,当它被训练来重建自己(例如自动编码器)时,它就变成了一种无监督的算法。还有其他混合范式,如半监督学习,但一旦你掌握了基本知识,你会在一眨眼的功夫就明白了。因此,很好地了解核心,事情将开始步入正轨。
2.必需的基础知识
来源:https://www . bouvet . no/bouvet-deler/6-机器学习入门提示
你可能已经意识到,我们显然需要温习我们的数学和统计学才能征服机器学习。
其实你还需要一些计算机科学知识和编程技巧。但是,在将机器学习应用于您的问题时,您将通过实践自然地获得这些技能。
3.学习策略
还没睡吗?现在,让我们看看我们应该如何征服机器学习的这个广阔领域。
首先,做好基础工作
当你还没有很好的基础时,从一个在线课程转到另一个是很诱人的。许多在线课程就其核心内容而言基本上是相同的,尽管它们可能以不同的方式交付或使用不同的编程语言。所以明智地利用你的时间吧!你需要的是彻底完成一门课程,这门课程会给你所有你需要的基础知识。避免编程语言特定的课程,比如“Python 中的机器学习”,因为它们会让你失去对基础知识的关注。
我得到了这个教训。我发现自己甚至在完成了相当多的 ML 课程后,还在思考一些非常基本的概念,如最大似然估计或单值分解。无论你为你的 ML 项目写了多少次 model.fit(X_train,y_train) 和 model.predict(X_test) ,这些差距都是很难弥补的。因此,把基础知识做好你就可以在将来不断扩展你在“扩展”方面的知识,比如图像处理和自然语言处理。请记住,你的目标是成为一名有能力的数据科学家/机器学习者,而不是只知道在数据集上应用 Sklearn 的人。
ML 入门推荐:
- Coursera 的机器学习——吴恩达(对 ML 最好的直观介绍。编程练习在 Matlab 中,但是如果你不熟悉 Matlab,现在可以跳过这些练习)。
- CS540 机器学习作者 Nando de Freitas (几乎所有 ML 概念和算法的综合数学基础)。
我们大多数人的学习曲线是这样的。来源:https://medium . com/@ pwalukagga/learning-curve-experience-at-SLC-boot camp-day 3-9f8f 34458959(改编)
如何让自己开心的小贴士:
- Youtube 是你最好的朋友。每当事情变得太抽象或者你被某样东西卡住了,就去 Youtube 上找找看!一些有用的 Youtube 频道(仅举几个)是:
- 使用视觉工具进行学习,正如我在另一篇帖子中所描述的。
- 什么时候开始觉得无聊?这里有一些真正有趣的书,会让你在学习数学和统计学时充满乐趣:
二、基础编程
Coursera、Udemy、DataCamp 上有很多不错的学习 R/ Python 的在线课程,这里就不赘述了。最好的学习方法,至少对我来说,是练习,大量的练习。下载一个玩具数据集,做一些操作,看看你能走多远。
如何让自己开心的小贴士:
- 你可以收集你自己的数据集(关于你自己的)。保存一个你日常生活用品的数据集,获取你每月支出的银行对账单,浏览你最喜欢的网站。然后你可以用它们做大量有趣的分析。
- 找一个社区,和他们互动。如果你被卡住了,你可以在 Stackoverflow 上发布你的问题。回答别人的问题也是一种非常好的学习方式。此外,在许多在线课程中,你可以找到比你知道得更多或更少的同学。在任何情况下,这种互动都会让你感到与他人有联系,并在过程中给你带来些许快乐。
当你第一次开始时,你想做的每一件事情都很简单。你编程越多,你就越不需要谷歌,你开始学习成为一个高效和干净的程序员。你基本上可以像写诗一样写代码(嗯,我想你比我更擅长写诗)。
4.让知识成为你的
在某些时候,你可能会觉得自己对所学的知识仍然没有信心。你可以这样做:
教导他人
内化你的知识的最有效的方法是教别人。写一篇关于你所学到的东西的博文。给一个朋友解释,一个不了解这个概念的同事。做一个关于这个话题的报告。尽你所能解释清楚,穿过浅层,把它修剪到核心。使用图形、图表、图画或任何方式来传达你的信息。
在工作/学习中应用编程
如果你有一份工作,试着应用编程来自动化一些工作任务,无论是操作仪表板的数据,还是操作 Excel 文件!这将帮助您快速熟悉和熟练编程。
如果您正在学习 Python,以下是您可以尝试的内容:
辅助项目(与朋友一起)
就你关心的话题找一个 ML 挑战,和一个朋友一起做。通过从一些流行的内核派生代码,你总是可以在 Kaggle 竞争中“生存”,你可能还会学到一些新东西,但这并不真正有趣。和朋友在一起,你会比别人更有动力保持忠诚,变得更好。
祝你机器学习之旅一帆风顺。享受学习!
以斯坦福的方式学习 NLP 第 1 课
给你的邀请,介绍自然语言处理和词向量
在 Unsplash 上由伊尼基·德尔·奥尔莫拍摄的照片
自然语言处理(NLP)的人工智能领域,通过其庞大的语言模型——是的,GPT 3 号,我在看着你——展示了它被视为机器执行最独特语言任务能力的一场革命。
由于这一点,公众对整体的看法是分裂的:一些人认为这些新的语言模型将为天网类型的技术铺平道路,而另一些人则认为它们是炒作推动的技术,将在很短时间内或根本不会存在于尘土飞扬的架子或硬盘驱动器中。
邀请
受此激励,我创作了这一系列故事,以一种友好的方式从头开始接近 NLP。
我也邀请你和我一起参加这个系列来学习 NLP,并且精通人工智能语言模型塑造的未来。
要加入我,你需要有一点 Python 和 Jupyter 笔记本的经验,在大多数情况下,我甚至不会要求你在你的机器上安装任何东西。
**这个系列将在统计学和微积分的深度上与斯坦福课程有显著的不同。**我将尽力避免涉及细节,因为在大多数情况下,我们将使用已经实现了我们将需要的大部分结构的 Python 库。但是,如果你想了解更多关于这些主题的知识,我强烈建议你学习课程笔记。
我们将使用 Deepnote 创建我们的 Python 笔记本,并使用云开发整个课程。
为什么选择 Deepnote?Deepnote 通过实时协作扩展了 Jupyter 笔记本的体验,并提供无预装的免费计算。你可以在这里复制我的 Deepnote 笔记本,并跟随我完成这个项目以获得最佳体验。
对于这门课程,我们将使用斯坦福大学 2020 年冬季 CS224N 材料的指南,因为它有一个全面的方法,一个包含课程的 Youtube 播放列表,以及斯坦福大学学生提供的其他资源。如果你想了解更多的课程,你可以访问它的网站。
我们将首先从自然语言处理的基础开始,然后学习它的关键方法:RNN、注意力、变形金刚等等。本课程结束时,我们将能够创建以下一些应用程序:
- 字义
- 依存句法分析
- 机器翻译
- 问题回答
自然语言处理简介
“自然语言处理 ( NLP )是语言学、计算机科学和人工智能的一个分支,涉及计算机和人类语言之间的交互,特别是如何给计算机编程,以处理和分析大量的自然语言数据。”—维基百科
根据这个定义,除了看到 NLP 是一个广阔的多学科领域,它还将我们引向一个问题:我们如何让计算机程序分析自然语言数据?
第一步是学习我们如何在计算环境中表示单词及其含义。
词语的含义
几年来,NLP 的工作主要是基于对单词同义词和上位词的建模。找出这些集合的一个方法是查看字典中的单词定义。
我们可以通过使用 Python 和一个名为 NLTK 的库来做到这一点。
试用 NLTK
“NLTK 是构建 Python 程序来处理人类语言数据的领先平台。它为超过 50 个语料库和词汇资源如 WordNet 提供了易于使用的接口,以及一套用于分类、标记化、词干化、标记、解析和语义推理的文本处理库,工业级自然语言处理库的包装器,以及一个活跃的论坛—Nltk.org
有了 NLTK,我们可以使用一个名为 WordNet 的内置词汇数据库来搜索一个单词的意思。WordNet 将名词、动词、形容词和副词分组为认知同义词集— 同义词集— ,每个同义词集代表一个不同的概念。
首先,让我们在 Deepnote 上登录创建一个“新项目”。打开笔记本,让我们通过在单元格中键入并使用 Shift+Enter 运行来安装 NLTK 库——对于那些使用不同 Python 笔记本平台的人来说,您知道的快捷方式应该可以正常工作。
之后,我们需要导入 NLTK 库并下载 WordNet 数据库。
有了这个,我们就都准备好了。为了从像 *'language,*这样的单词中获取 synsets 对象,我们必须导入 WordNet 数据库并使用方法。*synsets()*
。
看起来结果对象并没有给我们所有需要的关于这个单词的信息,只是一些关于每个*synset*
*的类似加密的信息。*为了更好地查看,我们可以循环查看结果,并使用*pos()*
和 *lemmas()*
格式化 synset 对象,借助一个自定义的对象列表来“漂亮地打印”单词表示。
关于 NLTK 中 WordNet 包的更多信息,您可以查看这个链接
NLTK 陷阱
您可以看到它作为字典工作正常,但是在开发 NLP 应用程序时有一些问题。
这很主观。它需要大量的人力,所以实际上不可能维持语料库。它也不会有效地计算单词相似度,而这对于我们的应用程序来说是非常重要的。那会导致我们编写不可靠或容易过时的人工智能软件。
离散表示
另一种方法是使用离散向量(包含 0 和 1 的向量)来表示不同的单词,但是这种方法也有一些缺陷。例如,它主要依赖 WordNet 的同义词列表,这会给我们带来一些问题。
由于这个原因,该领域转向另一种方法,即使用单词向量来表示单词。
根据上下文来表示单词
从一个人交的朋友身上,你就可以知道这个人是什么样的人。
单词向量的概念使我们能够处理单词和中心单词的上下文(附近的单词)。这使我们能够研究不同语境中单词之间的相似性。
单词向量(也称为嵌入或表示)
单词向量由包含非零值的 n 维向量表示,通过单词与其他单词的关系来表示单词。为每个单词构建一个密集向量,如下所示:
由 100 维单词向量表示的单词“medium”
如果你想扩展你在单词向量方面的知识,我推荐这本由艾莉森·帕里什写的超棒的笔记本。
可以用不同的方法创建单词向量。在斯坦福的 CS224N 课程中,呈现了 word 2 vec(miko lov et al . 2013)【1】【2】框架:
Word2Vec 概述:
- 收集大量的文本
- 用 n 维向量表示固定词汇表中的每个单词
- 对于文本中的每个位置,定义一个中心词和上下文词。
- 使用向量的相似度来计算给定中心词的上下文的概率。
- 重复单词向量以最大化这个概率
这个过程主要是通过使用神经网络学习单词之间的关联来实现的。我们不会实现 Word2Vec 框架来训练一个模型;相反,我们将使用 Python 库 gensim 中的 Word2Vec 模型。
“Gensim 是一个 Python 库,用于大型语料库的主题建模、文档索引和相似性检索。目标受众是 T21 的自然语言处理(NLP)和信息检索(IR)社区— Gensim 网站
探索单词向量与 gensim 库的关系
这个例子将使用 gensim 的嵌入式api
和Word2Vec
模块下载一个文本语料库,并创建一个 Word2Vec 模型来可视化一些有趣的单词向量特征。首先,我们需要安装 gensim 包。
现在我们需要获得用于创建 Word2Vec 模型的语料库。为此,我们可以使用api
模块。我们将下载从维基百科中提取的文本创建的 text8 语料库。之后,我们需要使用语料库来创建我们的 Word2Vec 模型,我们通过导入 Word2Vec 模型并实例化它,将语料库作为构造函数参数传递来完成。
这可能需要一些时间:)
**我们已经可以通过执行诸如查找相似单词和选择不属于一个组的单词这样的任务来处理单词向量。**你可以阅读 gensim 的文档了解更多关于可用的词向量运算。
还记得 NLTK 最大的缺陷可能是无法计算两个单词之间的相似度吗?通过使用单词向量,我们可以使用这个特性来执行更复杂的任务。例如,我们可以找到几组单词之间的相似之处。
我们可以用单词和模型表达式进行数学运算,比如:“国王—男人+女人=?”
摘自第一讲的视频
为了使用 *gensim、*对表达式求值,我们可以使用most_similar()
方法,将正值‘woman’
和‘king’
以及负值‘man’
作为参数传递。
我们还可以创建一个analogy
函数来简化这个操作:
单词向量为现代分布式单词表示奠定了基础,从而为 NLP 的发展铺平了道路。
对于第 2 课,您可以访问以下链接:
深入了解单词 2vec、手套和词义
thiago-gcandido.medium.com](https://thiago-gcandido.medium.com/learn-nlp-the-stanford-way-lesson-2-7447f2c12b36)
结论
在下一篇文章中,我们将讨论单词向量和词义,这是斯坦福课程第二讲的主题。我希望你喜欢阅读这篇文章。
如果你有,考虑在 推特 上关注我。
谢谢你的时间。保重,继续编码!
参考
软件和库
学习 R 中的主成分分析
使用 PCA 改进您的特征选择过程
PCA 是一种降维技术;这意味着您在建模过程中包含的每个额外变量都代表一个维度。
它是做什么的?:
就 PCA 实际做的事情而言,它采用高维度的数据集,并将其缩减为少数不相关的成分。需要考虑的是不相关组件的概念。如果我使用客户的收入(如果我碰巧有)&来预测他们的收入,那么我会添加一个额外的变量来表示他们的邮政编码中值收入,这两个变量很可能是相关的,下一个变量不太可能对我的模型准确预测收入的能力产生积极影响。
我刚才解释的想法是多重共线性。给定变量的一个预测因子可以由其他预测因子预测的想法。或者回到我刚才举的例子,实际收入可以通过他们所在地区的收入中值来预测;这两者可能是共线的。
入门:
组件 是如何确定的?
确定每个分量是因为它占了最大的方差,并且根据所占方差的下一个最大部分来选择每个后续分量。因此,组件 1 将占最大的差异,组件 2 将占第二大的差异,以此类推。
步骤:
- 缩放数据集
- 创建 pca 对象— prcomp
- 打印特征值
首先,加载 R 数据集,mtcars
data(mtcars)
接下来,PCA 最适合处理数值数据,所以您需要过滤掉任何非数值的变量。在我们的例子中,我们将使用 dplyr select 函数删除变量vs
& am
。
mtcars <- mtcars %>% select(- c(vs, am))
让我们将更新的、只有数字数据的数据集放入 pca 函数中,prcomp.
pca <- prcomp(mtcars, center = TRUE,scale. = TRUE)
这里需要记住的是缩放。缩放的目的是标准化变量间的方差。为什么有人会关心你问?因为每个组成部分背后的想法是,它们尽可能多地解释了差异。没有这种缩放,您的高方差变量将在您的组件中被过度表示。
现在,我们应该保留多少组件??:
在我们开始这一节之前,要记住的是,我们正试图减少我们的尺寸,因此最大限度地减少不必要的组件是理想的。
在决定保留多少组件时,我将给出三个主要考虑事项。
对于第一个跟随!
summary(pca)
我们在这里寻找的是proportion of variance
。正如我们一直在谈论的,这个想法是围绕着解释变异;如果你继续下去,你会看到第一个组成部分,PC1
占变异的 62.8%,PC2
占 23%,以此类推。
有了这些信息,你就可以考虑用最少数量的组件来解释你需要多少差异。这可能是您决定第一个组件的 63%就足够了,它可能是 86%的前两个,或 91%的三个。
考虑这类问题的一个有用工具是碎石图。
你会看到在碎石图上,我在 x 轴上画出了分量,在 y 轴上画出了分量的重要性。我们在上面看到的是,在第二个组件之后,每个附加组件的增量影响会显著下降。虽然有人可能会认为第三个组件的影响非常重要,足以得出值得包含第三个组件的结论,但不太可能有人会认为应该添加更多组件。
你可能会做的下一个评估是所谓的凯泽-古特曼准则。这里的规则很简单;仅保留特征值大于 1 的组件。
如果你不知道如何立即得到特征值;跟我来一次快速旅行吧。要获得每个组件的特征值,您只需要从 pca 对象中找到每个组件的方差或标准差的平方——如下所示。
pca$sdev ^ 2
如前所述,您将消除任何特征值不大于 1 的变量。这背后的想法是,如果特征值小于 1,那么该组件比单个变量贡献的方差更小。
基于我们所使用的方法,很明显我们在这里的路线是只使用前两个组件
了解您的组件:
知道你的组件是由什么组成的很重要。换句话说,哪些变量对任何给定的分量有贡献?geom_hline(yintercept=20)了解组件由什么组成很重要。换句话说,哪些变量对任何给定的分量有贡献。
print(pca$rotation)
看着第一个组成部分的各种贡献,我可能会努力建议第一个组成部分在很大程度上代表了汽车的动力或性能,如汽缸、马力、重量和显示为最高。
另一个可以很容易看到不同变量分组的方法是双标图。
pca %>% biplot(cex = .5)
正如我之前提到的,你可以看到气缸、马力、显示和重量都分组在一起。
使用线性回归将您的组件与原始变量进行比较:
为了确定使用常规变量与主成分的潜在预测影响,让我们使用每组进行回归,并比较每个模型的 r 平方。
对于每次回归,我们将尝试使用mtcars
数据集中的其他变量来预测 MPG。
我们现在将创建第一个模型,按原样预测所有变量。
fit_1 <- lm(mpg ~ ., data = mtcars)
现在让我们创建包含 mpg 和前两个组件的下一个数据集。
components <- cbind(mpg = mtcars[, "mpg"], pca$x[, 1:2]) %>% as.data.frame()
现在,我们将使用这些组件训练第二个模型
fit_2 <- lm(mpg ~ ., data = components)
现在到了关键时刻,让我们比较一下每个模型的 r 平方!
summary(fit_1)$adj.r.squared
summary(fit_2)$adj.r.squared
正如你在上面看到的,当只使用两个组件时,模型的 r 平方有一个不那么小的变化。
结论
我希望这有所帮助!这里要记住的最后一点是,这里的唯一目的是在不损失太多预测能力的情况下进行简化。请随意查看我在 datasciencelessons.com 的其他帖子&祝数据科学快乐!
从头开始学习 Python Lambda
Python 中 lambda 函数的注意事项
当处理元素列表时,Python 程序员通常有三种选择:常规的 for 循环、列表理解和 lambda 函数。对于 Python 初学者来说,lambda 函数通常被认为是“一个很酷的特性”,因为它的语法很短,而且与函数式编程很相似。但是对于初学者来说,这通常不是很简单。另一方面,即使对于长期使用 Python 的人来说,也不是每个人都一定熟悉 lambda,因为他们总能找到简单的替代方法。
相对于 lambda 函数,我个人更喜欢list/dictcomprehension。在本文中,我们将一起从头开始学习 Python Lambda 及其注意事项,无论您是初级还是高级 Python 程序员。我们开始吧!
什么是 Lambda 函数?
Python 中的 Lambda 函数是一个小型匿名函数。它不同于其他函数式编程语言,在其他函数式编程语言中,lambda 函数增加了功能。根据 Python 设计 Q & A :
如果你懒得定义一个函数,Python lambdas 只是一种速记符号。
我们都喜欢做懒惰的程序员,但仅此而已吗?
创建 Lambda 函数
lambda 函数是用一个表达式定义的,而不是我们通常在 Python 中使用的def
。任何 lambda 函数都遵循相同的规则:
lambda arguments: expression
它由三部分组成:
lambda
:任意 lambda 函数的关键字arguments
:输入函数的参数。该函数允许多个输入参数。expression
:函数在单个表达式中将做什么。Lambda 只接受一个表达式,但可以生成多个输出。
论据
Python lambda 函数支持各种输入参数,就像一个def
函数一样。
表情
Lambda 函数只接受单个表达式。因为它是一个表达式,所以可能会也可能不会被赋予名称。在下面的例子中,第二个 lambda 函数被赋予值sum_lambda
。但是第三个 lambda 函数没有名字。正如你所看到的,它仍然工作,但是代码第一眼很难读懂。
需要记住的一点是, lambda 函数不能包含任何语句。区分表达式和语句的一个简单的技巧是,如果你可以打印它或者给它赋值,那么它就是一个表达式。否则就是声明。
在 Python 中,语句包括return
、try
、assert
、if
、for
、raise
等。如果 lambda 函数包含一个语句,程序将引发SyntaxError
异常。
检查 Lambda 函数
那么,lambda 函数和常规函数有什么不同呢?让我们检查功能!
我们将使用上一个例子中的函数。让我们首先检查两个函数的类型。好吧,他们属于function
类这就说得通了。
>> print(type(sum))
>> <class 'function'>
>> print(type(sum_lambda))
>> <class 'function'>
然后,让我们检查一下表示法。sum_lambda
的名字是<lambda>
而不是“函数名”。即使我们给 lambda 函数赋值,它仍然是一个匿名函数。这种行为将导致一个我们将在最后讨论的限制。(先想想)
>> sum
>> <function sum at 0x10d2f30e0>
>> sum_lambda
>> <function <lambda> at 0x10d390200>
将 Lambda 函数与 Python 高阶函数一起使用
Lambda 函数通常与 Python 高阶函数结合使用。根据维基百科,
高阶函数是至少执行下列操作之一的函数:a)将一个或多个函数作为参数。b)返回一个函数作为结果。
在 Python 中,有几个内置的高阶函数,如map
、filter
、reduce
、sorted
、sum
、any
、all
。其中,map
、filter
和reduce
最常与 lambda 函数一起使用。
地图
函数有两个参数:一个输入映射函数和一个 iterable。映射函数将应用于 iterable 中的每个元素。map()
函数返回包含映射元素的迭代器。
映射函数可以用简洁的λ函数来表示。
滤镜
filter()
函数采用与map()
相同的参数:一个输入过滤函数和一个 iterable。过滤函数将应用于每个元素,filter()
函数返回一个包含过滤元素的迭代器。
下面是一个使用def
函数和 lambda 函数过滤偶数的例子。
减少
reduce()
函数来自 Python 内置模块functools
。它实际上是将一个函数累积应用于 iterable 中的所有元素,并生成一个值。函数有 3 个参数:一个输入函数,一个可迭代函数和一个可选的初始化函数。
第三个例子定义了一个初始值设定项 0,每次都将 dictionary 元素中的值添加到初始值设定项中。如果初始化器没有被定义,那么默认情况下程序将把第一个元素作为初始化器,这将引发一个TypeError
异常。
在 pytest 中使用 Lambda 函数
您可能有一个函数generate
生成一个随机值列表,这些值依赖于一个外部系统。当你进行单元测试时,你不希望generate
函数与外部系统通信。此外,您需要来自generate
函数的可重复结果,而不是每次的随机值。
在 Pytest 中,您可以使用 monkeypatch fixture 来修补生成这些随机值的部分。另外,使用 lambda 函数作为补丁函数使得代码更加简洁。
下面是示例代码。它使用 lambda 函数lambda _: 0
来修补random.randint()
。lambda 函数总是生成 0,它不关心输入参数,所以输入参数可以用_
来表示。
列表理解与λ函数
lambda 函数的一个很好的选择是列表理解。对于map()
、filter()
、reduce()
,都可以用列表理解来完成。列表理解是一种介于常规 for 循环和 lambda 函数之间的解决方案。在我看来,这是一个简洁而直观的解决方案。
很好奇大家对列表理解和 lambda 函数的看法。你更喜欢哪一个,为什么?
性能比较
了解 lambda 函数的性能并与常规的def
函数进行比较也很有趣。Lambda 函数需要的代码少,会对性能有影响吗?
比较内容包括:
- 创建函数(v.s .常规函数)的时间
- 调用函数的时间(v.s .常规函数)
- 是时候调用高阶函数了,比如
map()
(v.s. for-loop 和 list comprehension)
我使用 Python 内置函数[timeit](https://docs.python.org/3.8/library/timeit.html)
对代码片段计时。首先,我使用def
和 lambda 函数创建一个函数来计算一个数的平方。结果发现创建一个函数的时间几乎是一样的。
然后我调用这两个函数。它们比创建一个函数花费更长的时间,但是 lambda 函数在这里没有赢得任何时间。
最后一个是比较 for-loop 、 list comprehension 和 lambda 函数的性能。由于从映射对象到列表的转换,Lambda 函数花费的时间最长。在这种情况下,列表理解表现最好。
速度性能可以帮助我们决定选择哪种代码风格,但不应该是唯一的因素。我们还需要考虑代码的可读性和可维护性。
使用 Lambda 函数的限制
到目前为止,我们已经讨论了 lambda 函数的一些用例。它的简写符号使代码更加优雅和简洁。然而,总是有得有失。Python 开发者要理解 lambda 函数的局限性,避免“不必要的优化”。
- 在追溯中丢失信息
Lambda 函数是匿名函数,所以没有真正的函数名。当引发异常时,这可能会丢失信息。回溯只显示<lambda>
而不是有意义的函数名。
2.调试麻烦
在 IDE 中调试print(list(map(lambda x: x ** 2, [1, 2, 3])))
这样的语句并不容易。一种解决方法是给 lambda 函数添加一个“装饰器”。通常,我们会给一个def
函数添加一个像@debug
这样的装饰器,但是对于 lambda 函数来说这是不可能的。但实际上,decorator 是一个函数的 wapper,所以它可以将 lambda 函数作为输入参数。
下面是一个将debug
装饰器应用到def
函数和 lambda 函数的例子。修饰 lambda 函数有助于理解 lambda 函数在高阶函数中的行为。
3.不符合 PEP8
如果您将 Flake8 这样的 linter 应用到您的程序中,您将会得到一个警告:
不要分配 lambda 表达式,使用 def (E731)
Flake8 给出了一个非常合理的解释,这与我之前的观点相联系:
这样做的主要原因是调试。Lambdas 在回溯中显示为
<lambda>
,其中函数将显示函数名。
4.不支持注释
根据 PEP 3107 ,lambda 的语法不支持注释。一种解决方法是使用代表函数的typing.Callable
。例如,Callable[[int, int], str]
表示一个带有两个类型为int
的输入参数的函数,返回值的类型为str
。我们可以用它来暗示 lambda 函数的类型。
下面是我们如何在高阶函数中提示 lambda 函数的类型。
我希望你喜欢这篇文章,并且理解 Python lambda 函数的一些注意事项!如果你有任何想法,请在下面留下你的评论。
参考
[## 如何使用 Python Lambda 函数——真正的 Python
参加测验“Python 和其他编程语言中的 lambda 表达式源于 Lambda 演算,是一种……
realpython.com](https://realpython.com/python-lambda) [## Python 的 reduce():从函数式到 Python 式——真正的 Python
在本教程中,您将学习到:函数式编程是一种编程范式,它基于将一个问题分解成…
realpython.com](https://realpython.com/python-reduce-function/)
了解如何在 5 分钟内用模块和包组织您的 Python 代码
用通俗易懂的例子!
扎克·卡道夫在 Unsplash 上的照片
当您的 Python 代码变大时,随着时间的推移,它很可能变得杂乱无章。随着代码的增长,将代码保存在同一个文件中会使代码难以维护。此时,Python 模块和包帮助你通过使用文件和文件夹来组织和分组你的内容。
- 模块是带有的文件。py" 包含 Python 代码的扩展。它们有助于在同一个文件中组织相关的函数、类或任何代码块。
- 将大型 Python 代码块分割成包含多达 300–400 行代码的模块被认为是最佳实践。
- 包将相似的模块放在一个单独的目录中。它们是包含相关模块和一个 init 的文件夹。py 文件,用于可选的包级初始化。
- 根据您的 Python 应用程序,您可以考虑将您的模块分组到子包中,例如 doc、core、utils、data、examples、test。
让我们编写一个示例 Python3 代码来进一步理解模块和包:
**""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file
"""**import pandas as pdprint("cvs_get_module is loaded")*def* **display_file_location(*path, file_name*)**:
print("File Location: {}".format(path+filename))*class* **CSVGetInfo:**
*def* __init__(*self*, *path*, *file_name*):
self.path = path
self.file_name = file_name
*def* **display_summary(*self*):**
data = pd.read_csv(self.path + self.file_name)
print(self.file_name)
print(data.info())
丹尼尔在 Unsplash 上的照片
导入模块
为了在外部 Python 代码块中使用一个模块,我们需要将那个特定的模块导入到我们的代码结构中。为此,使用带有"import<module _ name>"语法的 import 语句。这里的模块名是指不带的 Python 文件名。py" 扩展名。一旦我们导入模块,我们使用点符号,**.”,**访问模块内部的元素。
# **ModulesExample.py
# Importing 'csv_get_module' and accessing its elements**import **csv_get_module****data_by_genres** = **csv_get_module.CSVGetInfo**("/Users/erdemisbilen/
Lessons/", "data_by_genres.csv")**csv_get_module.display_file_location**(data_by_genres.**path**, data_by_genres.**file_name**)data_by_genres.**display_summary()****Output:** cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):
通过重命名导入模块
我们可以用**‘导入< 模块 _ 名称 >作为< 替代 _ 名称>’**语法在导入的同时重命名模块。这可能有助于缩短长模块名。
# **ModulesExample.py
# Importing 'csv_get_module' and accessing its elements**import **csv_get_module** as **cg****data_by_genres** = **cg.CSVGetInfo**("/Users/erdemisbilen/Lessons/", "data_by_genres.csv")**cg.display_file_location**(data_by_genres.path, data_by_genres.file_name)data_by_genres.display_summary()**Output:** cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):
从模块导入特定名称
我们可以导入模块的特定名称,而不是加载模块中包含的所有元素。此外,我们可以通过用逗号分隔名称来导入多个元素。
注意,这里我们不需要使用点符号,因为我们直接从<module _ name>import<element _ name>’语法中导入带有的名称。
from **csv_get_module** import **display_file_location** as **dfl****dfl**("/User/Python/","ModulesExample.py")**Output:** File Location: /UserModulesExample.py
导入模块内的所有名称
我们也可以使用星号(*)直接导入模块的所有名称,尽管这不是一个好的做法。如果导入多个包含同名元素的模块,这可能会导致名称冲突。
from **csv_get_module** import *****
隐藏模块的元素
如果我们想要隐藏模块的一些元素,我们可以用下划线 “_” 开始命名元素。这种元素不能导入到外部文件中,因为这种命名约定使该元素成为模块本身的私有元素。
区分独立脚本运行和模块加载
包含 Python 代码的文件可以作为独立脚本运行,也可以作为模块加载到另一个代码结构中。
有时,考虑到这些用途,需要将 Python 文件中的代码分开。Python 有内置的 name 属性,当文件作为模块加载时,该属性为我们提供了模块名称。当文件作为独立脚本运行时,这次它返回 main 字符串。
**""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file
"""**import pandas as pdprint("cvs_get_module is loaded")*def* **display_file_location(*path, file_name*)**:
print("File Location: {}".format(path+filename))*class* **CSVGetInfo:**
*def* __init__(*self*, *path*, *file_name*):
self.path = path
self.file_name = file_name
*def* **display_summary(*self*):**
data = pd.read_csv(self.path + self.file_name)
print(self.file_name)
print(data.info())if **__name__ == '__main__'**: **data_by_genres** = **CSVGetInfo**("/Users/erdemisbilen/Lessons/",
"data_by_genres.csv") **display_file_location**(data_by_genres.path,
data_by_genres.file_name) data_by_genres.display_summary()
只有当脚本作为独立脚本运行时,上述 if 语句中的代码才会运行。
Python 中的包
包将相似的模块放在一个单独的目录中。它们是包含相关模块和一个 init 的文件夹。py 文件,用于可选的包级初始化。
init。py 在引用包内模块时执行一次。这个文件可以保留为空,或者可以选择实现包级初始化代码。
根据您的 Python 应用程序,您可以考虑将您的模块分组到子包中,例如 doc、core、utils、data、examples、test。由于相似的模块保存在不同的文件夹中,这使得你的整体结构得到很好的组织和维护。
Lynn Kintziger 在 Unsplash 上拍摄的照片
从包中导入模块
我们可以使用包名(文件夹名)和点“.”来导入包内的模块接线员。
from **utils.csv_get_module** import **display_file_location** as **dfl****dfl**("/User/Python/","ModulesExample.py")**Output:** File Location: /UserModulesExample.py
关键要点
- 在 Python 中,组织大型代码块由模块和包管理。
- 这简化了代码结构,增加了代码的可重用性,并简化了维护和测试工作。
结论
在这篇文章中,我解释了 Python 中模块和包的基础知识。
这篇文章中的代码可以在我的 GitHub 库中找到。
我希望这篇文章对你有用。
感谢您的阅读!
同时学习 SQL 和 MongoDB 简单的方法(第 1 部分)
学习一切,简单的方法。
礼貌: Pixabay
读了这个标题,你可能会想,究竟谁会在学习 SQL 的同时学习 MongoDB 呢?让我给你一个小蛋糕,同时学习一门关系和非关系数据库管理语言超级容易。你也可以称它们为脚本语言。
哦,你是在告诉我们它们在一起学的时候超级容易学吗?是的,它是。只要在整个系列中跟随我,你就会意识到我没有错。
但是,你为什么想要学习这些呢?嗯,知道一些可以帮助你在数据库上交互和执行操作的语言总是很棒的。另一个大问题是,如果你对数据科学、数据分析、业务分析、web 开发、应用程序开发和开发运营感兴趣,那么你必须学习这些。偶尔你将不得不接触和使用这样的数据库,如果事先没有这方面的知识,我担心你会因为没有学习它而感到内疚。
基本概述:
SQL : SQL 是一种数据库计算机语言,设计用于关系数据库中数据的检索和管理。SQL 代表结构化查询语言。本教程将让您快速入门 SQL。它涵盖了基本理解 SQL 所需的大部分主题。SQL 数据库包含:
- 数据存储在称为表的数据库对象中。
- 每个表都被分解成更小的实体,称为字段。
- 一条记录也称为表中每个条目中数据的行。
- 列是表格中的垂直实体,包含与表格中特定字段相关的所有信息。
MongoDB :使用 MongoDB 查询语言 (MQL)查询 MongoDB 数据库。作为一个 NoSQL 数据库,MongoDB 确实没有使用 SQL 作为它的查询语言。相反,MongoDB 依赖于几个驱动程序,这些驱动程序允许其引擎与多种语言进行交互。非 SQL 数据库包含:
- 数据存储在被称为集合的数据库对象中。
- 一个文档是一组键值对。文档具有动态模式。这可以称为行。
- _id :这是每个 MongoDB 文档都需要的字段。
- 字段是文档中的名称-值对。一个文档有零个或多个字段。这可以称为列。
数据类型概述:
SQL:
- 整数
- Smallint
- Numeric(p,s)——其中 p 是精度值; s 是一个刻度值。例如,numeric(6,2)是一个小数点前有 4 位、小数点后有 2 位的数字。
- Decimal(p,s)其中 p 为精度值; s 是一个刻度值。
- 实数单精度浮点数。
- 双精度——双精度浮点数。
- Float§其中 p 为精度值。
- Char(x)其中 x 是要存储的字符数。它用空格填充,以填充指定的字符数。
- Varchar(x)其中 x 是要存储的字符数。它没有空间垫。
- Bit(x)其中 x 是要存储的位数。
- 位变化(x)其中 x 是要存储的位数。长度最大为 x。
- 日期-存储年、月和日的值。
- 时间-存储小时、分钟和秒的值。
- 时间戳-存储年、月、日、小时、分钟和秒的值。
- 带时区的时间-与 Time 相同,但也存储指定时间相对于 UTC 的偏移量。
- 带时区的时间戳——与时间戳相同,但也存储指定时间相对于 UTC 的偏移量。
- 年-月间隔-包含年值、月值或两者。
- 日-时间间隔-包含日值、小时值、分钟值和/或秒值。
MongoDB:
- 字符串——这是存储数据最常用的数据类型。MongoDB 中的字符串必须是 UTF-8 有效。
- 整数——用于存储数值。整数可以是 32 位或 64 位,具体取决于您的服务器。
- boolean——用于存储布尔值(真/假)。
- double——用于存储浮点值。
- 最小/最大键——用于将数值与最低和最高 BSON 元素进行比较。
- arrays——它用于将数组或列表或多个值存储到一个键中。
- 时间戳 ctimestamp。当文档被修改或添加时,这对于记录非常方便。
- 对象-它用于嵌入的文档。
- Null——用于存储空值。
- 符号——它的用法与字符串相同;然而,它通常是为使用特定符号类型的语言保留的。
- 日期**—用于以 UNIX 时间格式存储当前日期或时间。您可以通过创建日期对象并向其中传递日、月、年来指定您自己的日期时间。**
- 对象 ID——它用于存储文档的 ID。
- 二进制数据——用于存储二进制数据。
- code——它用于将 JavaScript 代码存储到文档中。
- 正则表达式——它用于存储正则表达式。
我不打算在一个部分中用所有的信息轰炸你,因为即使对我来说处理这么多信息是困难的,我知道那是什么感觉。我们将一步一步、非常流畅地学习 SQL & MongoDB。我将在第 1 部分介绍大约 4 个州。
创建表格/集合并插入记录:
表/集合的创建非常简单,如果您更专注于提取和分析数据,就不需要经常这样做。顺便说一下,SQL 是区分大小写的。
SQL:
# Syntax to create a table
> **create** **table** "tablename" ("columnName" "datatype", "columnName" "datatype");# Create a table:
> **create** **table** winner ( Id INT, name VARCHAR(15))# Insert a row:
> **insert** **into** winner (Id) **values** (1)
(or)
> **insert** **into** winner **values** (1)
MongoDB:
# Syntax to create a collection
> db.createCollection(name, options)# Create a collection:
> db.createCollection("winner")# Syntax to insert a record> db.collectionName.insert({"key":"value"})# Inserting a record:
> db.winner.insert({"name" : "Kunal"})
查询数据库:
查询数据库的一般定义是从集合或表中获取数据。查询数据库的基本过程非常简单。在 SQL 中,通过使用 select 来完成,在 MongoDB 中,通过使用 find 或 aggregate 来完成。以下是从数据库中获取数据的方法:
SQL:
# Syntax to query a table
> **select** column **from** tables# Query all the records
> **select** * **from** winner# Query the DB, select all rows from the Id column
> **select** Id **from** winner
MongoDB:
# Syntax to query a collection, to select all the documents
> db.COLLECTION_NAME.find({})# Get all the records using **find**
> db.winner.find({})# Fetch data using **aggregate** > db.winner.aggregate(
[{
$group: {
'_id':null,
'max':{'$first':"$$ROOT"}
}
}])
对于初学者,我建议您熟悉 find 函数,因为直接切换到 aggregate 函数会有点困难。原因是在后面的阶段你必须学习聚合,发现函数有各种限制,为了实现这一点,你必须使用聚合函数。
对查询数据进行排序:
当您希望数据按特定顺序排列时,排序非常重要。您之前可能运行过的查询会以随机顺序给出结果。排序在 SQL 中称为订单**,在 MongoDB 中称为排序。我们可以根据列、升序、降序和限制对数据进行排序。让我告诉你怎么做。**
SQL:
# Syntax for ordering the data
> select * from tablename order by asc/desc/column/limit# Fetch all records and sort by ascending
> **select** * **from** winners **order** **by** asc# Fetch all records and sort by descending
> **select** * **from** winners **order** **by** desc# Fetch all records and sort by column
> **select** * **from** winners **order** **by** Id# Fetch all records and sort by multiple columns
> **select** * **from** winners **order** **by** Id, name
MongoDB:
# Syntax to sort the data - find()
> db.collectionName.find({}).sort({**KEY**:1})# Sort the data in descending order using find()
> db.winners.find({}).sort({"_id":-1})# Sort the data in ascending order using find()
> db.winners.find({}).sort({"_id":1})# Sort the data in ascending order using aggregate()
> db.users.aggregate(
[
{ **$sort** : { name: 1 } }
]
)# Sort the data in descending order using aggregate()
> db.users.aggregate(
[
{ **$sort** : { name: -1 } }
]
)
_id 是为插入集合中的每条记录捕获的 objectID,它是必需的。如果您解码 ObjectID,您将从中获得一个时间戳。对于聚合管道中的函数,必须加上前缀 $。
基于条件查询数据库:
一次获取所有的记录总是很简单的,但有时可能会耗费你大量的时间,有时你甚至不需要查看全部数据。您还可以根据特定条件过滤数据。过滤的作用是,它从你的显示中去掉其余的数据,你只能看到需要的数据。在 SQL 中使用 where 完成,在 MongoDB 中使用$ match 在 aggregate 中完成,只是一些简单的赋值在 find 中完成。让我告诉你怎么做。
SQL:
# Syntax to query data based on condition
> **select** * **from** table **where** *condition*# Fetch data based on a condition
> **select** Id **from** winners **where** name="Kunal" **and** Id>4# Another condition
> **select** name **from** winners **where** Id **between** 10 **and** 12
Between 条件将过滤掉符合上述条件的结果。
MongoDB:
# Syntax to query based on a condition
> db.winners.find({condition})# Fetch data based on a condition, Id greater than 2
> db.winners.find({"Id":{"$gt":2}})# Using aggregate, match is just like where in SQL
> db.winners.aggregate(
[{
"**$match**":{"Id":{"$gt":2}}
}])
我们在查找和聚合中使用了相同的条件,但是你不认为查找更容易实现吗?发现有它的局限性,这就是为什么你必须在稍后阶段切换到聚合**。我建议你习惯使用聚合,这将为你节省几个小时使用 find 的麻烦。**
主题演讲:
- SQL 区分大小写。
- SQL 有表,MongoDB 有集合。
- ****分号是分隔每个 SQL 语句的标准方式。
- MongoDB 管道函数需要 $ 作为前缀。
- 在 MongoDB 中使用"",提高代码可读性。
- MongoDB 有 find 和 aggregate 来查询 DB。
- 在 MongoDB 中, _id 是一个包含时间戳的 ObjectID。
如果你能走到这一步,你就太棒了。至此,我们结束了系列的第一部分。****
如果您遇到任何错误或需要任何帮助,您可以随时在 LinkedIn 上发表评论或 ping 我。
*****LinkedIn:*https://bit.ly/2u4YPoF
在 Github 上关注我,了解更多令人惊叹的项目和教程。
Github:https://bit.ly/2SQV7ss
我希望这有助于你增强你的知识基础:)
更多关注我!
感谢您的阅读和宝贵时间!
页(page 的缩写)这个系列的第二部分很快就要出来了。永远保持对知识的渴望。
学习业务,成为伟大的数据科学家
意见
每个数据科学家的核心(抱歉,不是编码)
许多有抱负的数据科学家认为,成为数据科学家需要具备以下条件:
- 编码
- 统计的
- 数学
- 机器学习
- 深度学习
和任何其他技术技能。
上面的列表是准确的;我上面列出了你现在需要的大部分数据科学家资格。这是不可避免的,因为现在许多工作列表总是把这些技能列为先决条件。只需看看下面的数据科学家工作要求和偏好示例。
取自 indeed.com
大多数需求听起来都是技术性的;学位、编码、数学和统计。虽然,有一个潜在的商业理解要求,你可能一开始从这个招聘广告中没有意识到。
如果你仔细观察,你会发现他们需要有应用分析方法解决实际商业问题经验的人。这意味着你的日常任务将包括解决业务问题,反过来,你需要了解公司经营什么样的业务以及流程本身是如何运作的。
你可能会问,“为什么我需要理解它?只要创建机器学习模型,问题就解决了,不是吗?”这种想法很危险,我会解释原因。
提醒一下,我认为让你成为伟大的数据科学家的不仅仅是你的编码技能有多好,或者你对统计理论或者业务理解的掌握程度**,**,而是多种因素的结合。
当然,任何人都可以同意或不同意我的观点,因为我相信没有特定的技能可以让你成为伟大的数据科学家。
数据科学家就业难。要进入这个领域并不容易。有很多申请人和拥有相似技能的人,你需要脱颖而出。商业理解是一种技能,它肯定会让你从池塘里的所有鱼中脱颖而出。
在我作为数据科学家的经历中,没有什么技能比业务理解技能更让我感到被低估了。我甚至以为,你不需要了解我早期职业生涯中的业务。我错了。
不过,我并不惭愧地承认,我起初并不认为业务方面是必不可少的,因为许多数据科学教育和书籍甚至没有教我们这方面的知识。
那么,为什么学习业务至关重要,以及它如何影响您作为数据科学家的就业?
想象一下这种情况。你在以糖果为主要产品的食品行业数据部工作,公司计划发布一款新的酸味糖果产品。然后,公司要求销售部门出售产品。现在,销售部门知道该公司有一个数据部门,并要求数据团队提供新的线索,他们可以在哪里销售酸糖果。
在任何人抱怨“这不是我们的工作,我们创造了一个机器学习模型!”或者“我是数据科学家,不在销售部门工作。”不,这恰恰是数据科学家在公司做的事情;许多项目是与另一个部门合作解决公司的问题。
回到我们的场景,那么如何正确处理这个问题呢?你可能会想,“只需创建一个机器学习模型来生成线索。”是的,这是在正确的轨道上,但你到底如何创建模型?依据是什么?使用机器学习模型解决商业问题是否可行?
你不能突然使用机器学习模型,对吗?这就是作为数据科学家,业务理解如此重要的原因。你需要更详细地了解糖果业。一直问这样的问题,
- "我们到底想解决什么样的业务问题?"
- “我们甚至需要一个机器学习模型吗?”
- “什么样的属性与糖果销售有关?”
- “公司内外的糖果销售策略和实践如何?”。
以及许多你能想到的与业务相关的业务问题。
了解你的公司经营什么样的业务以及与业务相关的一切非常重要,因为作为一名数据科学家,你需要理解数据。
虽然说商业理解技能是必不可少的很容易,但要获得这种技能并不容易。
教育是一回事;例如,与拥有生物学学位的人相比,如果你的教育背景是通信,你可能有更大的机会脱颖而出,申请公关公司的数据科学职位。
虽然工作经验很快就涵盖了这一点。在类似行业的另一个职位的工作经验将提供重要的杠杆作用,因为你已经了解业务流程。
对于一名新生来说,这可能是一个很难进入的行业,但事后看来,作为一名新生也有很多好处。我记得泰勒·福克曼在他的 LinkedIn 上的帖子,为什么这个行业应该考虑应届毕业生,我同意。应届毕业生可以:
- 有备而来
- 渴望了解业务
- 产生影响
新生应该成为那些已经建立了数据之旅的公司的目标。该公司可以更容易地教授许多商业方面的知识,因为大学新生在商业领域毫无经验。在我看来,永远不要把新生排除在外。
我也会告诉你我的经历。当我第一次获得数据项目时,我根本没有考虑业务,只是试图建立机器学习模型。结果是多么的灾难性。
我把模型呈现给相关方,脑子里在炒作。我的模型结果不错,对数据了如指掌,也知道自己用的模型的理论。很简单,对吧?所以,错了。原来用户并不在乎我用的型号。他们更感兴趣的是知道我是否已经考虑了业务方法“A ”,或者为什么我使用了与业务完全不相关的数据。最后讨论到我需要更多的商业培训。
这很尴尬,但我一点也不惭愧地承认,不考虑业务理解是我的错。我可能在模型创建或统计方面是最棒的,但不了解这个行业最终会成为一场灾难。从那天起,我试着学习更多关于业务流程本身的知识,甚至在考虑任何技术问题之前。
结论
在我看来,不管是不是大一新生,都要尽量去学业务。
专注于一个你觉得感兴趣的行业;金融、银行、信贷、汽车、糖果、石油等。每一项业务都有不同的方法和策略;你只需要专注于学习你喜欢的行业。
数据科学家就业难。进入这个领域并不容易。有许多申请人和许多拥有相似技能的人,**你需要脱颖而出。**商业理解无疑是将你与池塘中所有鱼区分开来的技能。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
在强调编码语言或工具之前,先学习这 3 个基本的数据概念
爱德华·豪厄尔在 Unsplash 上拍摄的照片
前几天我收到了一个 Instagram DM,这让我开始思考。这个人解释说,他们的职业是数据分析师,有多年的经验。但是,他们也说,他们觉得他们的技术能力略有欠缺,因为他们从未听说过我页面上提到的许多术语。这个人提到他们期待通过学习更多的技术工具(SQL、Python、R 等)来扩展他们的技能。)
当我思考如何进一步建议这个人的时候,我意识到这个人是实现他们期望的转变的最佳人选。为什么?他们已经掌握了数据技能和数据思维,这对于在数据领域取得成功至关重要。
我(和许多其他人)担心掌握现有的每一种技术工具或产品。我担心只拥有微软产品(SQL Server、Excel、Power BI)的经验,觉得自己需要拓宽视野,成为更好的数据分析师。我经常看到数据科学家在网上质疑和争论 Python 和 R 哪个更适合他们的工作。
但是,与我的 Instagram 新朋友交谈让我意识到,这些担忧和辩论非常愚蠢。工具和编程语言在不断发展变化,来来去去。但是你知道什么会留下来吗?核心概念。曾经构建的每一个工具或语言都会依赖于这些核心概念。
如果你知道如何获取一个数据集,操作它,并以一种提供真正洞察力的方式呈现它(或者至少引出更多你以前没有的问题…因为这种情况会发生!!),你已经走上了成为某种数据专家的正确道路。
这种对数据的基本理解是如此强大。您可以理解这一点,并将其与您选择的任何技术工具相结合。然后,您可以对数据进行分组和筛选,以进行业务报告和 KPI 监控,进行统计测试以回答有关数据的问题,预测未来的数据,甚至生成 AI 模型以使用数据来帮助指导业务行动。你可以用包含数百万行的巨大数据集做所有这些事情!
好吧,我知道我在向你推销这个想法,所以让我开门见山吧。如果你理解数据概念以及如何应用它们,你可以很容易地用你选择的任何技术工具或产品来实现这些概念。
不过,别担心,我来这里不只是为了向你推销这个然后离开。我将从一个总体的角度谈论我作为数据分析师日常使用的 3 个基本数据技能。不涉及任何技术术语或代码。如果您开始掌握这些(以及其他)数据概念,那么掌握它们并将其应用于任何工具都很容易。我甚至在文章的结尾有一个严肃的生活帮,它将帮助你在任何你想掌握的工具中进一步运用你的新数据知识。跟着我,我抓住你了!
#1.过滤数据
在数据世界中至关重要的第一个数据概念是过滤数据。老实说,过滤数据是一个超级简单的概念,也是我们人类每天都在做的事情。举这个例子。如果你要去吃麦当劳,你应该问问你的三个室友是否想要一些(因为你不想成为那个室友)。但是,在你去问你的室友是否想吃鸡块之前,你要记得你的三个室友中有两个甚至不喜欢麦当劳,所以你最后只问了一个。基本上你是基于某种“属性”从你的“数据集中”过滤掉了你的两个室友,这种属性就是他们是否喜欢麦当劳。
数据分析师或数据科学家过滤数据的方式完全相同。如果你正在对女性顾客进行分析,你将需要使用你所掌握的任何工具来过滤掉非女性顾客。如果您试图构建一个有助于为成年人推荐护肤产品的模型,您可能会希望过滤掉任何非成年患者的数据。
长话短说,过滤数据就是从你所有的数据集中去掉所有不需要的数据,直到剩下你分析所需的数据。
#2.数据类型转换
另一个常用的数据技能是数据类型转换。数据类型是数据存储在电子表格、软件或数据库中时可以归入的特定类别。数据类型的一些常见示例有:
- 字符串(例如:“你好,这是一个字符串。”)
- 整数(例如:400)
- 小数(例如:400.17)
- 布尔值(例如:TRUE)
当我们处理数据集时,我们希望确保每个数据属性都存储为正确的数据类型。
我们不希望将整数 123 存储为字符串。如果我们将 123 存储为字符串,电子表格、软件或数据库将无法对其执行必要的操作。电脑会被弄糊涂的。如果我们告诉计算机我们有一个字符串(“123”),但后来我们想把“123”加到某个东西上,计算机会说“等一下”。你教我“123”是一个字符串,基本上是一个单词。丫不能添话狂人!只能加数字!!!!"
抱歉,假设的计算机变得如此激进,但你明白了。为了确保我们能够在以后对数据执行适当的操作,我们希望绝对确保它被表示为正确的类型。
#3.汇总数据
我现在想谈的最后一个概念是聚合数据。聚合数据是如此如此如此强大。聚合数据可以将您从一个由行和列数据组成的巨大文本文件中解放出来,并将其转化为一个更有意义、更悦目的汇总值或汇总表。
注意到我一直在说总结这个词吗?这可能是解释聚合的最佳方式,因为聚合接受多行数据,并将它们汇总到较少的行中。
照片由SQLiteTutorial.Net提供
如果您有一个数据集,其中包含需要相加的数字(如数量或销售额),那么汇总这些数据的最简单方法之一就是求和。在下面的例子中,我取了一个包含我每天喝的咖啡量的数据集。我通过对其求和来对其应用聚合,这在右侧创建了我的数据的汇总视图。这个总结显示我总共喝了 4 杯咖啡(至少在这个数据集中)。
还有许多其他非常直观的聚合操作,即使对于数据世界的新手来说也是如此。这些操作中的每一个都回答了一些问题,这些问题告诉我们关于数据集的更多信息。其他简单聚合操作的一些示例如下:
- 数数(有多少条记录?)
- 最大(最大的观察是什么?)
- 最小(最小的观察值是多少?)
- 平均(我倾向于观察什么?)
OK coooOooOol…那么下一步是什么?
我知道我之前答应过给你一个生活帮奖,所以别担心——我没有忘记。现在,您已经更牢固地掌握了数据专业人员工作流程中的一些最重要的步骤,您可以将它们应用于您选择的任何技术工具,即使您是一名新手。怎么会?和我们最好的朋友,我们的终极救世主,谷歌一起!
每当我想用某个工具来练习我的技能,并且我需要复习如何正确地执行它,我会以这种格式搜索:
[插入技术工具]中的[插入数据技能]
我向你发誓,每当我用这种格式搜索时,我总能找到很棒的文档、博客帖子或其他资源(比如 Stack Overflow ),将我的想法引向解决方案。
那么,你觉得聚合数据有趣吗?你想提高你的 SQL 技能吗?然后,我建议回顾并着手:
在 SQL 中聚合数据
你基本上是一个在 Python 中过滤数据的专家,但是现在你想在 R 中尝试一下吗?试试我的生活帮和谷歌:
在 R 中过滤数据
听听这个在追求自己的数据职业梦想前几个月不知所措的女孩吧。先学概念。以后再担心技术问题。技术总是在发展,但基础却没有。
原载于 2020 年 8 月 7 日https://data dreamer . io。
学会下注——使用贝叶斯决策
贝叶斯思维如何影响我们在概率世界中的决策
我们生活在不确定性中,有时我们不得不在给定的几个选项中做出选择,而我们对这些选项都知之甚少。随着时间的推移,如果我们一次又一次面对同样的选择,我们可能会知道哪个选择会给我们最大的回报,哪个是第二好的,等等。一般来说,这可以说是人类的学习过程,由我们的目标引导,最大化总回报(或最小化总损失或遗憾)。
马库斯·斯皮斯克在 Unsplash 上的照片
此外,一些重要的业务应用程序也可以用这种方式建模。思考以下情况:
(1)给定一堆股票代码,每一个都有不同的回报,你如何理性地选择一个能使你的回报最大化的代码?
(2)有三种网站登录页面设计可供您尝试,您会如何选择一种最大化您的指标(如转化率)的设计?
(3)假设您想要推广您的业务,并且有三个不同的广告场地,您将如何选择一个最符合您预算的场地?
这些现实的业务问题都可以方便地抽象为以下场景:
假设你有 N 个吃角子老虎机(或强盗),每个都有自己的概率来给你奖励 r。你如何计算出随着时间的推移选择哪个吃角子老虎机,以便尽可能多地获得奖励?
这种说法看似简单,但实际上,决策过程要复杂得多,因为你要不断处理两难的选择,是坚持当前相对较好的选择,还是尝试其他可能更好的选择,即开发还是勘探。我们需要一个合理的框架来处理这种情况。
贝叶斯强盗
贝叶斯土匪提供了一个直观的解决问题的方法。一般来说,它遵循以下步骤:
- 对每个强盗给予奖励的可能性进行初步猜测。用统计学的语言来说,这就是假设每个土匪的行为(给不给奖励)有一定的先验分布。由于我们试图模拟概率,一个方便的先验分布将是贝塔分布,它通常用于模拟 0 到 1 之间的随机变量。请注意,如果您对强盗行为的潜在分布一无所知,您的理性猜测将是平等对待每个强盗,即假设均匀分布,这是 beta 分布的特例。
- 从每一个土匪身上抽取一个样本,根据其目前的分布情况。
- 关注样本最高的土匪;通过选择来决定你获得的奖励(后悔)的数量,并**相应地更新强盗的分布。**在统计学的语言中,你有一个随机变量的特定参数的先验分布,现在你有了随机变量的值的新观察,你能够更新你关于随机变量的先验信念,通过应用贝叶斯规则得出后验分布;最终结果是有一组新的分布参数来解释新的观察结果:
先前分配:P(A)
新观察:x
后验分布:P(A|x) ~ P(x|A)*P(A)
即后验分布与似然*先验分布成正比
4.回到步骤 2 并重复。
照片由Tine ivani在 Unsplash 上拍摄
模拟
让我们看一个带有一些代码的具体例子。
首先,让我们导入必要的包:
import numpy as npfrom scipy.stats import betaimport matplotlib.pyplot as plt
让我们定义我们的强盗;这些数字表示各自的强盗提供奖励的概率,你可以随意修改这些数字并运行不同的模拟:
bandits = np.array([0.75, 0.5, 0.6])
随着基础知识的清除,现在下面的函数说明了贝叶斯强盗的核心:
def experiment(accumulated_rewards_per_bandit, times_chosen_per_bandit, bandits, num_draws=1):
for _ in range(num_draws):
bandit_chosen = np.argmax(np.random.beta(1+accumulated_rewards_per_bandit, 1+times_chosen_per_bandit-accumulated_rewards_per_bandit)) reward = get_reward_from_bandit_i(bandits, bandit_chosen)
accumulated_rewards_per_bandit[bandit_chosen] += reward times_chosen_per_bandit[bandit_chosen] += 1 a = 1+accumulated_rewards_per_bandit
b = 1+times_chosen_per_bandit-accumulated_rewards_per_bandit
return a, b
让我们一行一行地分解这个函数。首先,让我们指定输入参数:
每个强盗累积的奖励:在一个实验中,每个强盗累积的总奖励,它的大小等于强盗的数量。
times _ chosen _ per _ bandit:在一个实验中,每个强盗被选中的次数,其大小等于强盗的数量。
强盗:我们各种奖励概率的强盗。
num_draws:一个实验中的试验次数
回想一下,从根本上说,我们的目标是更好地了解不同强盗的回报概率,这意味着我们试图获得对基础分布越来越准确的估计,在我们的情况下,这些分布都是贝塔分布。
请注意,beta 分布由两个参数 a 和 **b,**唯一定义,在我们的示例中,这两个参数分别代表强盗获得奖励的尝试次数(在我们的示例中等于累积奖励)和强盗未获得奖励的尝试次数。
因此,我们的目标是在试验中保持这两个量的精确记录。
现在应该清楚我们在上面的函数中试图实现什么了。循环查看试验次数,我们首先找出给出最大样本的强盗,然后通过在下面的行中选择这个强盗来确定我们是否得到任何奖励:
reward = get_reward_from_bandit_i(bandits, bandit_chosen)
这里我使用下面的简单实现来确定奖励:
def get_reward_from_bandit_i(bandits, i):
return np.random.rand() < bandits[i]
您可以看到这个实现导致奖励为 1 或 0。在实践中,你可能想设计自己的奖励机制来反映你的问题的性质。
在获得奖励(或不获得)后,我们可以更新累积的奖励和为我们的采样 bandit 选择的时间,这将在下一次迭代中作为更新的 beta 分布参数 a 和 b。
最后,在循环所有试验之后,我们获得完全更新的分布参数并返回它们。
现在,我们已经配备了贝叶斯强盗的核心组件,让我们使用下面的代码片段开始运行模拟:
if __name__ == "__main__":
bandits = np.array([0.75, 0.5, 0.6]) num_draws_per_experiment = [300] accumulated_rewards_per_bandit = np.zeros(bandits.size) times_chosen_per_bandit = np.zeros(bandits.size) for i in num_draws_per_experiment:
a, b = experiment(accumulated_rewards_per_bandit, times_chosen_per_bandit, bandits, i)
结果
似乎我们需要一种方法来确定我们做得有多好。在本文中,让我们尝试绘制每组 beta 分布参数的概率密度函数,看看它们是否显示出任何可辨别的模式。
让我们发挥这一功能:
def plot_beta(x_range, a, b, filename):
x = x_range
y0 = beta.pdf(x, a[0], b[0])
y1 = beta.pdf(x, a[1], b[1])
y2 = beta.pdf(x, a[2], b[2]) plt.plot(x, y0, color='red', lw=2, ls='-', alpha=0.5, label='pdf: 1st bandit')
plt.plot(x, y1, color='green', lw=2, ls='-', alpha=0.5, label='pdf: 2nd bandit')
plt.plot(x, y2, color='blue', lw=2, ls='-', alpha=0.5, label='pdf: 3rd bandit') plt.legend() plt.savefig(filename)
对不同数量的试验运行绘图功能,我们得到以下 pdf 图:
每个强盗的 pdf 图,试验次数=1,10,50,100
每个强盗的 pdf 图,试验次数=200,500,1000,2000
请注意,第一个强盗(红色)的回报概率最高,为 0.75,在 100 次尝试后,随着其 beta 分布的形状缩小并在真实值的 0.75 附近达到峰值,它逐渐胜出,而其他两个强盗的分布形状仍然相对平坦且分布广泛,这暗示了不确定性。
尽管通过足够多的试验,每个强盗的分布将趋向于在奖励概率的真实值附近达到峰值,但在这个问题中,我们更感兴趣的是找到最好的强盗,而不是精确地推断隐藏的奖励概率。可以对我们的模拟进行一些改进:例如,可以将学习率(> 1 或< 1)应用于累积奖励的更新,以微调我们是倾向于保持当前的好选项还是更多地探索其他选项。
在后续文章中,我将展示贝叶斯土匪如何帮助构建股票的动态投资组合,这可以被建模为具有随时间变化的潜在回报概率的土匪。因此,请关注我,继续关注更多内容。
现在是学习编码的时候了
这是学习编码的最佳时机!
多年来,人们一直告诉你,学习编程是让自己更有竞争力的一个好方法。现在,世界各国都面临着惊人的失业,没有比这更好的时机来采取行动了!
苹果公司首席执行官蒂姆·库克甚至说,学习编码将很快变得比学习英语作为第二语言更重要。
每年,Stack Overflow 都会发布对开发人员的个人资料、职业生涯和生活的深刻见解。Stack Overflow 是一个面向专业和爱好者程序员的问答网站。
去年,近 90,000 名开发人员参与了调查。
调查结果表明,编程工作不仅有很高的职业满意度,而且这些职业实际上是可以实现的,即使是那些没有受过正规培训的人也是如此。
注意:2020 年的结果现在随时都有可能出现——我打算在发布最新数据时更新这篇文章。
为什么要学编码?
好了,你已经听说了编码是一项重要的技能。现在我们来探究一下为什么!
越来越多的工作被自动化,这完全改变了就业市场。这并不意味着引人注目——而是作为一种先发制人的方式来改变你的行业,走在它的前面。
专业开发人员收入颇丰
开发商也是赚大钱!这因国家、城市和语言的不同而不同。
尤其是在现在的新冠肺炎时代,远程工作已经走到了前台。一个编码职业可以让你不那么依赖地理上的收入。
有一点是一致的,那就是开发人员的平均工资很高!
专业开发人员收入颇丰。资料来源:Nik Piepenbreier
我强调了一些在 Medium 上有大量资源的职业,包括 web 开发人员和数据科学家。
根据 Stack Overflow 的调查,所有这些调查的年薪中值接近或超过 10 万美元!
专业开发人员对他们的职业很满意
根据 Stack Overflow 2019 调查结果,专业开发人员对自己的工作非常满意。
事实上,近 3/4 的受访者对自己的职业感到满意。相比之下,只有 1/2 的一般受访者(根据一篇会议委员会文章)。
大多数职业开发人员对自己的职业很满意。资料来源:Nik Piepenbreier
但是我没有受过教育…
我们来看看职业开发者都有什么样的学历。
根据堆栈溢出调查,大多数受访者至少拥有学士学位。但这不应该吓走你:
2019 年,超过 15%的职业开发者没有大学学历!
让我们仔细看看背后的数据:
有些开发人员没有大学学历也能凑合!资料来源:Nik Piepenbreier
总而言之,不要让缺乏大专教育阻碍了你的发展。网上有很多很棒的资源!
重要的是让你的作品为你发光!考虑开发一个展示你技能的作品集。当你没有受过正规教育来支持这一点时,这一点尤其重要。
作品集可以放在像 Github.com 这样的网站上,应该放在你的简历里。
专业人士编码多久了?
超过 2/3 的专业开发人员从事编码工作不到 10 年!
即使获得最低限度的编程技能来自动化你的一些工作,也确实有助于就业。这些类型的技能会让你对现在和潜在的雇主非常有价值。 《挂典》 甚至将编码列为人们必须学习的技能。
让我们来看看人们从事编码工作有多长时间了,专业人士从事专业编码工作有多长时间了:
大多数回答者从事编码工作不到十年。资料来源:Nik Piepenbreier
根据 Stack Overflow,像 VBA 这样的语言开发者拥有最多的经验。
Python 和 PHP 等语言的开发人员经验最少。
这很好,因为你的竞争对手经验更少。
我们很快就会看到 Python 也是最受欢迎的语言之一。
从哪里开始?
选择哪种语言是最常见的问题之一。这是一个棘手的问题,但值得探索。
Stack Overflow 询问他们的回答者他们想学什么语言,喜欢使用什么语言,害怕使用什么语言。虽然调查结果并不是从哪里开始的确定列表,但它们可以给你一个大概的指示,告诉你什么可能是愉快的学习,什么可能不是。
超过四分之一的 2019 受访者想学 Python!资料来源:Nik Piepenbreier
上面的图表显示了专业开发人员最想要的语言——这意味着还不知道它的开发人员想要使用它。
最受喜爱的语言有哪些?
让我们探索一下开发人员使用哪些语言,以及继续喜欢使用哪些语言。
Rust 和 Python 是非常受欢迎的语言。资料来源:Nik Piepenbreier
这些语言是一个很好的地方,可以让你开始探索最适合你想要完成的事情。
开发者现在喜欢什么语言?
让我们看看 Stack Overflow 的数十万名受访者是怎么说的:
VBA 语仍然是一种可怕的语言。资料来源:Nik Piepenbreier
虽然这并不意味着要避免使用什么语言的明确列表,但这可能会让您了解人们在使用什么语言时会感到吃力或乏味。
(这个可怕的数字意味着开发人员目前正在使用这种语言,但是没有兴趣继续这样做。)
现在怎么办?我从哪里开始?
所以,你有学习编程的动力?现在怎么办?
Python 是一个很好的起点!Python 很容易掌握,实现起来也很快,而且背后有一个很棒的、有用的社区。它非常有用,可以让您构建各种各样的工具,从自动化脚本到机器学习模型,再到 web 应用程序。
但是不要止步于此。
四处看看,在谷歌上搜索最受欢迎和最想要的语言,看看什么样的项目能引起你的共鸣。
帮助您起步的资源
- 我的电子书为数据科学提供了 Python 的完整介绍。点击这里查看。它附带了一个交互式环境。
- 请关注我的 Medium,并查看我的其他一些关于使用 Python 实现工作自动化的文章。
- 我是如何通过 CS Dojo 学会编码的——这是一个伟大的 Youtuber 上的一个伟大的视频,它有惊人的资源来指导你进入编程。
- Kaggle 的培训部分 — Kaggle 是数据科学竞赛的首要资源,拥有一个很棒的培训部分。
- 代码学院为各种语言提供免费的入门课程。
学习编码。学习 Python。
你想学习编码但是不知道从哪里开始吗?你来对地方了。我将向您介绍学习 Python 的原因,以帮助您决定它是否适合您,并提供一个资源列表来学习基础知识,设置您的环境,找到项目开始,以及在您的编码之旅中可以去哪里获得帮助和支持。
为什么要学 Python?
Python 是一种多功能的编程语言,可以用于软件开发、数据分析、机器学习甚至 web 开发!如果你想给机器人编程,从事数据科学职业或者做漂亮的可视化,学习 python 是一个很好的起点!
如果这是您第一次学习编码,那么语法(语句的结构)与英语相似,需要更少的代码行,一旦您基本掌握了逻辑、语法和结构,就可以很容易地应用于其他编程语言。
然而,如果你更专注于 web 或应用程序开发,你可能会考虑其他编程语言。学习编码时,HTML、CSS 和 JavaScript 也是很好的起点。不过,不要停止阅读,下面的许多资源和技巧都与任何新开发人员相关!
资源
根据你的学习风格,有不同类型的课程可供你选择。有带代码示例的书面教程、带交互式编码问题的短视频、现场编码视频或简单的教科书。我在这个列表中包括了一系列的资源,这样你可以尝试一下,决定哪种学习方式最适合你。
免费学习编码
1。FreeCodeCamp
FreeCodeCamp 是一个学习编程的专用社区平台。他们有课程、教程、视频和文章来帮助您入门,并涵盖许多不同的编程语言。他们网站上的课程主要集中在 web 开发上,如果你想学习 HTML、CSS 和 JavaScript,这是一个很好的起点!
对于 python,他们已经编写了一个参考资料综合指南,以及一个 YouTube 课程。
编程语言: Python、HTML、CSS、JavaScript + more
**级别:**初级、中级、高级
**内容类型:**文章、视频、互动教程
2。HiPy
HiPy 是一个开放的社区,致力于向任何人介绍 Python 编码。他们在利物浦定期举办活动,并有一系列初学者友好的笔记本,你可以通过它来工作,还有一个Python 入门课程,涵盖如何开始。他们还有一个 YouTube 频道,最近还播放了现场编码活动,绝对值得一看!
编程语言: Python
**级别:**初级、中级、高级
**类型:**教程、视频、事件
- EdX 课程
EdX 有一系列 python 课程可供选择。这些课程可以免费完成,也可以选择付费获得证书。这些课程通常由公司或大学开办,你可能需要探索找到适合你的课程。我发现这些课程时好时坏。
查看这个微软课程为绝对初学者介绍 Python!
编程语言: Python、HTML、CSS、JavaScript +更多
**级别:**初级、
高级、**类型:**课程
4。Coursera
与 EdX 类似, Coursera 有一系列不同的免费课程,需要付费才能获得认证。
如果你在寻找机器学习的介绍,我去年完成了吴恩达的机器学习课程,强烈推荐你去看看!它提供了一个广泛的概述,包括每周作业和课程中的问题。我真的很喜欢这种教学风格,作业很有趣,也很有挑战性!我唯一的警告是,作业使用了一种叫做 Octave 的编程语言,这种语言有时会有点尴尬——课程中有 Octave 的介绍,但是如果你是编程新手,你可能会发现有时会有点棘手!
编程语言: Python、HTML、CSS、JavaScript +更多
**级别:**初级、中级、高级
**类型:**课程
5。Kaggle 微课
Kaggle 是一个举办竞赛和数据挑战的数据科学平台。它还提供微型课程,包括对 python 的介绍,以及带有包括 python 和数据科学概念的现场编码演示的 YouTube 频道。一旦你掌握了基础知识和数据科学的基础,你就可以加入社区,在运动场比赛中练习你的技能,例如泰坦尼克号挑战赛,或者探索 Kaggle 数据集用于你自己的项目。
**编程语言:**Python
级别:中级、
高级、**类型:**教程、视频
6。w3 学校
W3Schools 是一个学习 web 技术的网站,包含代码示例和 Python、HTML、CSS 和 JavaScript 的交互式教程。我经常回头查阅 w3 的文档和详细的解释,包括如何使用这个函数或包的例子。
编程语言: Python、HTML、CSS、JavaScript +更多
**级别:**初学者
**类型:**文档、教程
7。Udemy
Udemy 提供超过 100,000 门在线课程,主题广泛,语言多样。不同的教师提供了大量的 python 课程,但是您可以通过仅指定免费课程并选择您要寻找的级别和主题来缩小范围。如果你和某个老师很熟,并且喜欢他们的教学风格,我建议你利用上面的资源学习基础知识,并使用 Udemy 深入某个特定的主题。
注意: Udemy 也包含付费课程,但它们经常打折,价格大幅降低,所以最好等这些!
编程语言: Python、HTML、CSS、JavaScript +更多
**级别:**初级、中级、高级
**类型:**课程
8。用 Python 自动化枯燥的东西
如果你喜欢书,那么 用 Python 自动化枯燥的东西 是一个很好的起点,内容也可以在网上找到。它提供了关于如何开始的实际例子,以及你可以在每章末尾完成的项目例子。
编程语言: Python
**级别:**初学者,中级
**类型:**书
9。用于数据科学的 python
如果您已经掌握了基础知识,并且正在寻求探索 Python 与数据科学的关系, Python for Data Science 是一个有价值的资源,同样可以在网上免费获得,尽管从书架上拿一份副本也很方便!
**编程语言:**Python
级别:中级、
高级、**类型:**书
付费资源
还有一些资源为他们的学习平台提供订阅
1。365 数据科学
365DataScience 是一个数据科学学习平台,初期免费提供课程材料样本。我个人没有使用过这一资源,但它们涵盖了数据科学中的一系列主题,并有一个免费层,让您在承诺订阅之前体验一下。
编程语言: Python,SQL
级别:中级,
高级,**类型:**互动教程
2。使用 Codecademy 学习基础知识
Codecademy 需要订阅才能访问全部课程内容,并提供不同编程语言的入门和高级课程。随着时间的推移,免费访问的内容发生了显著变化。虽然这是我第一次学习 Python 时的首选资源,因为我喜欢课程的互动风格,但现在有了这个平台,你可以中途通过一个章节,除非你注册,否则无法前进。
编程语言: Python、HTML、CSS、JavaScript +更多
**级别:**初级、中级
**类型:**互动教程
3。数据请求
如果您已经熟悉 Python 的基础知识,并且希望将您的知识应用到数据科学的概念中,请查看 DataQuest 。像前两个平台一样,DataQuest 也需要订阅,但他们提供免费试用,所以如果你有兴趣,就试试吧!
编程语言: Python,SQL,R
级别:中级,
高级,**类型:**互动教程
故障排除
学习编码时最难的部分之一是当你陷入困境时,试图找出要搜索的内容。你练习得越多,这就越容易!这里有几个常见的地方,你可能会找到你正在寻找的答案:
1。堆栈溢出
当搜索一个编程问题时,排名靠前的结果通常来自 StackOverflow 。Stackoverflow 是一个开放的社区,人们可以在这里提问,其他开发人员也可以提供帮助。很有可能,你遇到的问题,别人已经在 StackOverflow 上问过了,可能的解决方案正等着你呢!
2。开发到
DEV 是一个软件开发人员的社区,他们聚在一起互相帮助。除了开发社区共享的播客和视频之外,该平台还通过文章、教程和讨论支持协作和网络化学习!如果您注册了,您也可以与社区分享您的编码之旅和您学到的东西,并结识其他学习编码的人!
3。中等
Medium 有一系列致力于学习编码的出版物。TowardsDataScience 有许多关于数据科学和 Python 的文章和教程,BetterProgramming 和 HackerNoon 也有关于编程的内容,你也可以找到公司博客,如网飞技术博客,他们分享技术文章和教程。
4。数据科学堆栈交换
与 StackOverflow 类似,数据科学 Stack Exchange 是一个提出技术问题的论坛,这次专门针对数据科学和机器学习。在对 Python 问题进行故障排除时,该资源经常出现在搜索结果的顶部,并且是另一个社区可能已经有了您正在寻找的答案的站点!
5。推特
Twitter 上有一个庞大的技术社区。许多人加入了 #100DaysOfCode ,承诺在 100 天的过程中每天都发推特,分享他们学到的东西,并在他们的旅程中支持其他人。如果你遇到了困难,你也可以联系这个社区,有人可能会回答你的问题或者给你指出一些可以帮助你的东西。
6。加入 Python 社区
还有在世界各地举办聚会和代码之夜的全球网络。也有许多 meetup 团体专注于举办技术讲座、教程和活动——查看 Meetup 或 Eventbrite 了解您当地的活动。同样值得考虑的是有空闲频道的在线社区和小组、电报小组或虚拟聚会,在那里你可以加入学习、分享和交流。
安装您的 Python 环境
到目前为止,您已经阅读了大量的资源,接下来,让我们在您的机器上安装 Python!
安装 Python 时有几种不同的选项,这取决于您使用的操作系统以及您希望如何设置。对于新程序员,我推荐安装 Anaconda ,它上手很快,适用于 Windows、MacOS 和 Linux。
Python 2 还是 Python 3?
对 Python 2 的支持于 2020 年 1 月 1 日停止。你可能仍然会发现用 Python 2 编写的软件,但是如果可能的话,我建议安装/升级到 Python 3!
什么是蟒蛇?
Anaconda 是 Python 和 r 的开源发行版,这意味着它安装了您需要开始使用的所有必要软件和软件包。它包括:
- Python 和 R 编程语言
- 预装 python 包
**conda**
,一个 python 包管理器,可以让你轻松安装和更新 python 包。你可能还会看到提到的pip
,conda
是pip
的替代物。- Spyder 是一个集成开发环境(简称 IDE),除了测试、调试和检查程序的工具和许多使编程更容易的功能,包括自动完成,它还包括一个文本编辑器——想想微软的 Word,但用于编写代码!
- (可选但推荐) PyCharm 是另一个 IDE,安装时会提示你是否想和 Anaconda 一起安装。我建议这样做!比起 Spyder,我更喜欢 PyCharm,因为它更容易导航和开始使用。
- Jupyter Lab/Jupyter 笔记本也可以通过 Anaconda Navigator 安装。这些工具允许你在文本或可视化的同时编写代码,在演示项目或浏览教程时会很有用。
如果您已经有了上面没有包括的首选 IDE,比如 Sublime 或 Visual Studio 代码,请查看 Anaconda 文档以了解如何在 IDE 中选择 Anaconda Python 作为您的 Python 解释器。
浏览器中的 Python
你也可以通过使用小饰品在你的浏览器中访问 Python,如果你想保存你的代码,你也可以在那里设置一个账户。
安装 Python 的其他方法
如果您不想使用 Anaconda,您可以从 Python 软件基金会下载并安装 Python。
如果你使用的是 Linux 或 MacOS,你可能已经预装了 Python,但这可能不是 Python 3。如需更多安装选项,请遵循 RealPython.com 上的说明。
下一步是什么?
那么您已经安装了 python,了解了基础知识,并准备好开始一个项目了!
下面列出了一些可能的项目和挑战,希望能给你一些启发:
1。代码战争
CodeWars 有许多编码招式或挑战,在这里你可以测试你的 python 技能,并竞争解决从初学者到难以置信的高级的问题!
2。欧拉项目
感觉像一个新的挑战?为什么不尝试使用 python 解决前 100 个欧拉项目问题呢?你可以在 Twitter 上关注 #ProjectEuler100 ,加入社区解决挑战!我在 2020 年初开始挑战,目标是在年底前完成所有 100 个目标…进入今年的第 5 个月,我远远落后于目标!
3。开始一个项目
查看 Medium 和 DEV.to 的教程,你可以跟随它开始你的第一个项目,或者如果你正在寻找一个数据科学挑战,查看 Kaggle 上的Titanic Machine Learningchallenge。
请关注我的下一篇文章,我将通过一个项目,探索数据集,创建可视化,并为您提供继续编码之旅的技能和工具。
感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱!