实用机器学习(一)

本文为学习李沐2021斯坦福秋季课程《实用机器学习》时所做的笔记,仅供学习复习回顾,不作任何商业用途,详细信息请访问跟李沐学AI

课程介绍

机器学习工作流程

数据获取

寻找数据集的一些网站

Papers With Code 论文复现代码以及用到的一些数据集

Kaggle Datasets Kaggle竞赛平台

Graviti 格物钛 国内数据集收集平台

各大框架的开源数据集,各类比赛的数据集等等。

数据融合

收集的数据集并不一定能够完全满足当前训练数据的要求,要根据数据情况对收集的数据进行一定的融合,处理。对于0值或者NaN等特殊数据,要进行处理。

数据生成

在无法找到足够的数据集的情况下,我们可以去生成相应的数据集。使用GANs去增大数据集体量,也可以通过数据增强,来增多我们的数据集。例如在CV问题中,我们经常使用对图像的裁剪,旋转,拉伸来增强我们的数据集。

网页数据抓取

网页抓取工具

凭借python工具,通过一个带浏览器表示的url请求,来向web网站抓取数据。

1
2
3
4
5
6
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_optinos.headless = True # 通过添加浏览器标识,可以减少网站对于爬虫的反爬限制,但同一IP地址短时间发起多个请求时,依旧会被认为异常行为
chrome = webdriver.Chrome(chrome_options=chrome_options)

page = chrome.get(url)

虽然我们只是出于学习的目的去收集数据,但我们绝对不能去侵害别人的隐私信息!!!

数据标注

是否有足够多的标注的数据,根据标注数据的数量来选择下一步来进行学习的模型。

半监督学习

  • 只有少量被标注的数据,大量未被标注的数据
  • 对数据分布做出假设,以此来使用为标注的数据
    • 连续性假设:特征相同的数据往往标注类型相同
    • 聚类假设:同一类数据的标注相同
    • 流型假设:数据内在复杂性,往往比数据本身维度要低

自学习算法

通过众包进行标注

将数据标注任务通过众包方式来进行数据标注。

众包方式进行的数据标注任务,需要考虑数据标注的难度,成本。

Active Learning

  • 与半监督学习相似,但会有人的干预,认为选择关注的数据
  • Uncertainty sampling选择那些最不确信的数据进行学习
  • 多个模型进行投票预测

质量控制

众包数据标注者的质量不能保证高质量,需要对最终的质量进行确定。

弱监督学习

  • 自动生成标注
  • 数据编程

数据处理

探索性数据分析

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from IPython import display
display.set_matplotlib_formats('svg')

data = pd.read_csv('house_sales.zip')
1
2
null_sum = data.isnull().sum()
data.columns[null_sum < len(data) * 0.3] # columns will keep
1
data.drop(columns=data.columns[null_sum > len(data) * 0.3], inplace=True)
1
2
# 查看数据类型是否正确
data.dtypes
1
2
3
4
5
6
# 对数据进行转化
currency = ['Sold Price', 'Listed Price', 'Tax assessed value', 'Annual tax amount']
for c in currency:
data[c] = data[c].replace(
r'[$,-]', '', regex=True).replace(
r'^\s*$', np.nan, regex=True).astype(float)
1
2
3
4
5
6
7
# 房屋面积转换
areas = ['Total interior livable area', 'Lot size']
for c in areas:
acres = data[c].str.contains('Acres') == True
col = data[c].replace(r'\b sqft\b|\b Acres\b|\b,\b','', regex=True).astype(float)
col[acres] *= 43560
data[c] = col
1
data.describe()
1
2
3
4
# 过滤掉不正常数据
abnormal = (data[areas[1]] < 10) | (data[areas[1]] > 1e4)
data = data[~abnormal]
sum(abnormal)
1
2
3
4
5
# 绘制房屋价格图
ax = sns.histplot(np.log10(data['Sold Price']))
ax.set_xlim([3, 8])
ax.set_xticks(range(3, 9))
ax.set_xticklabels(['%.0e'%a for a in 10**ax.get_xticks()]);
1
2
3
4
# the differences between different house types.
data['Price per living sqft'] = data['Sold Price'] / data['Total interior livable area']
ax = sns.boxplot(x='Type', y='Price per living sqft', data=data[types], fliersize=0)
ax.set_ylim([0, 2000]);
1
2
3
_, ax = plt.subplots(figsize=(6,6))
columns = ['Sold Price', 'Listed Price', 'Annual tax amount', 'Price per living sqft', 'Elementary School Score', 'High School Score']
sns.heatmap(data[columns].corr(),annot=True,cmap='RdYlGn', ax=ax);

数据清理

  • 异常值
  • 违反规则
  • 模式冲突

实用机器学习(一)
https://www.spacezxy.top/2021/09/21/practical-machine-learning/practical-machine-learning-1/
作者
Xavier ZXY
发布于
2021年9月21日
许可协议