零基础实战机器学习
黄佳
新加坡科研局首席研究员
19489 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
零基础实战机器学习
15
15
1.0x
00:00/00:00
登录|注册

03|实战5步(上):怎么定义问题和预处理数据?

你好,我是黄佳。
《打好基础:到底什么是机器学习?》中,我和你说了到底什么是机器学习,你还记得我们的结论吗?机器学习是一种从数据生成规则、发现模型,来帮助我们预测、判断、分析和解决问题的技术。现在,你是不是跃跃欲试,准备动手开跑机器学习程序了?
不要着急,在实战之前你还需要掌握最后一个知识点,也就是机器学习项目分为哪些步骤,你才好跟着一步步走。一个机器学习项目从开始到结束大致分为 5 步,分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能这 5 步是一个循环迭代的过程,你可以参考下面的图片:
我们所有的项目都会按照这 5 步来做,我把它简称为实战 5 步。为了让你更深地理解这 5 步,在后面能更快地上手,我会带你做一个项目,我会给你清楚解释每一个步骤的目的和背后的原理。我会把这个项目分成两节课,今天我们先来一起搞定前两步,也就是定义问题和数据的预处理。
好了,我们正式开始吧!

第 1 步 定义问题

我们先来看第一步,定义问题。在定义问题这个环节中,我们要剖析业务场景,设定清晰的目标,同时还要明确当前问题属于哪一种机器学习类型。如果不搞清楚这些,我们后面就无法选择模型了。
所以首先,我们先得来了解一下我们这个项目的业务场景。假设你已经入职了“易速鲜花”的运营部,正在对微信公众号推广文案的运营效率进行分析。你收集了大量的软文数据,包括点赞数、转发数和浏览量等等,就像下面这样:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了机器学习项目实施的关键步骤,着重强调了定义问题和数据预处理两个阶段的重要性。作者以微信公众号推广文案的运营效率分析为例,详细阐述了业务场景的剖析、目标设定以及机器学习类型的明确。在数据预处理阶段,作者强调了数据集中特征和标签之间的相关性,以及数据清洗的重要性。此外,文章还介绍了数据可视化的重要性,以及如何利用Python的Pandas和Matplotlib等工具进行数据可视化和数据清洗。总的来说,本文为读者提供了清晰的项目实施步骤和实例,帮助读者更好地理解机器学习项目的实际操作流程。文章还涉及特征工程、构建特征集和标签集、以及拆分训练集、验证集和测试集等内容,为读者提供了全面的实践指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础实战机器学习》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(29)

  • 最新
  • 精选
  • 在路上
    置顶
    黄老师好,面对空缺的数据,可以采用默认值、均值、中位值等方式填充,有条件的话,可以和业务方沟通,要求补全空缺数据。

    作者回复: 谢谢,这是特别好的经验分享。值得置顶!

    2021-09-03
    21
  • 年轻
    置顶
    真想一爱看完,太难等了

    作者回复: 嗯,谢谢支持。我们这边也多努力一下。

    2021-09-03
    3
  • 黄老师,请问如果工作人员录入数据的时候空值并没有留空,而是用“\”,“-”,“无”等字符来标注的话,有什么好的处理方法呢?我一般是用excel进行筛选,查看异常值,然后排序之后吧异常值整行删掉,处理干净之后再用pandas导入。想看看有没有一些更智能的方法。谢谢🙏

    作者回复: 有方法。试试这个: 例子: import pandas as pd data = [[100] ,['/'], ['Zero'], [99]] columns = ['成绩'] df = pd.DataFrame(data=data, columns=columns) df 原始数据输出: 成绩 0 100 1 / 2 Zero 3 99 转换语句 df['新成绩'] = pd.to_numeric(df.成绩.astype(str).str.replace(',',''), errors='coerce').fillna(0).astype(int) df 新字段的输出 成绩 新成绩 0 100 100 1 / 0 2 Zero 0 3 99 99 是不是比Excel快很多呀?

    2021-09-03
    4
    23
  • shatu
    在开始前花了一些时间解决中文乱码的问题: 1.编码不为utf-8且文件路径有中文,产生的乱码 用记事本另存为utf-8编码,加入engine='python'参数 例: df_ads = pd.read_csv('易速鲜花微信软文.csv',engine='python',encoding='utf-8') 2.matplotlib作图标签产生乱码的 例: plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

    作者回复: 谢谢分享!

    2021-09-23
    3
    9
  • 自娱自乐★
    mac中图表横纵坐标乱码解决方法 plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

    作者回复: 💍👑

    2022-04-30
    7
  • 茜茜
    谢谢黄老师的讲解。这是我的回答,我还买了老师的书《零基础学机器学习》,昨天浏览了一遍,希望把这本书和专栏的知识都学会。 #思考题1 import matplotlib.pyplot as plt import seaborn as sns from pylab import mpl plt.rcParams['font.sans-serif'] = ['KaiTi'] plt.figure(figsize = (20,8), dpi = 100) fig, axes = plt.subplots(2, 2, figsize = (20,8), dpi = 100) #散点图 axes[0,0].plot(df_ads['点赞数'],df_ads['浏览量'],'r.', label='点赞数-浏览量') axes[0,1].plot(df_ads['转发数'],df_ads['浏览量'],'b.', label='转发数-浏览量') axes[1,0].plot(df_ads['热度指数'],df_ads['浏览量'],'g.', label='热度指数-浏览量') axes[1,1].plot(df_ads['文章评级'],df_ads['浏览量'],'y.', label='文章评级-浏览量') axes[0,0].set_xlabel('点赞数') axes[0,0].set_ylabel('浏览量') axes[0,1].set_xlabel('转发数') axes[0,1].set_ylabel('浏览量') axes[1,0].set_xlabel('热度指数') axes[1,0].set_ylabel('浏览量') axes[1,1].set_xlabel('文章评级') axes[1,1].set_ylabel('浏览量') plt.legend(loc = 0) axes[0,0].legend(loc = 2) axes[0,1].legend(loc = 2) axes[1,0].legend(loc = 2) axes[1,1].legend(loc = 2) plt.show() #箱线图 plt.figure(figsize = (20,8), dpi = 100) fig, axes = plt.subplots(2, 2, figsize = (20,8), dpi = 100) data1 = df_ads[['浏览量','点赞数']] data2 = df_ads[['浏览量','转发数']] data3 = df_ads[['浏览量','热度指数']] data4 = df_ads[['浏览量','文章评级']] fig1 = sns.boxplot(x = '点赞数', y = '浏览量', data = data1, ax = axes[0,0]) fig1.axis(ymin = 0, ymax = 800000) fig2 = sns.boxplot(x = '转发数', y = '浏览量', data = data2, ax = axes[0,1]) fig2.axis(ymin = 0, ymax = 800000) fig3 = sns.boxplot(x = '热度指数', y = '浏览量', data = data3, ax = axes[1,0]) fig3.axis(ymin = 0, ymax = 800000) fig4 = sns.boxplot(x = '文章评级', y = '浏览量', data = data4, ax = axes[1,1]) fig4.axis(ymin = 0, ymax = 800000) axes[0,0].set_xlabel('点赞数') axes[0,0].set_ylabel('浏览量') axes[0,1].set_xlabel('转发数') axes[0,1].set_ylabel('浏览量') axes[1,0].set_xlabel('热度指数') axes[1,0].set_ylabel('浏览量') axes[1,1].set_xlabel('文章评级') axes[1,1].set_ylabel('浏览量') plt.show() #思考题2 # 用中位数填充 df_ads['转发数'].fillna(df_ads['转发数'].median(), inplace=True) #用众数填充 df_ads['转发数'].fillna(df_ads['转发数'].mode(), inplace=True)

    作者回复: 感谢支持,一起加油😁!作业完成的非常认真,我看到你还给出了median()和众数的方法mode()。很好。

    2021-09-03
    7
  • 安迪密恩
    想请教老师一个问题,箱线图为什么会有离群点?最大值和最小值区间不是应该包含所有的点了吗?

    作者回复: 箱线图是一种基于五位数摘要(“最小”,第一四分位数(Q1),中位数,第三四分位数(Q3)和“最大”)显示数据分布的标准化方法。 中位数(Q2 / 50th百分位数):数据集的中间值; 第一个四分位数(Q1 / 25百分位数):最小数(不是“最小值”)和数据集的中位数之间的中间数; 第三四分位数(Q3 / 75th Percentile):数据集的中位数和最大值之间的中间值(不是“最大值”); 四分位间距(IQR):第25至第75个百分点的距离; 晶须(蓝色显示) 离群值(显示为绿色圆圈) “最大”:Q3 + 1.5 * IQR “最低”:Q1 -1.5 * IQR 在箱线图中,最大值和最小值的定义有些特殊。他们并不总是数据中的实际最大值和最小值。箱线图中的最大值是数据中小于或等于Q3+1.5IQR(IQR为四分位距,等于Q3-Q1)的最大值,而最小值是数据中大于或等于Q1-1.5IQR的最小值。所谓的离群点,就是那些超出这个范围的数据点。

    2022-07-18
    2
    3
  • dao
    如果大家遇到这个问题: RuntimeWarning: Glyph missing from current font 尝试了很多方法都无法解决,那请删除 matplotlib cache ,然后重启 jupyter kernel。 --- rm -rf ~/.matplotlib/ jupyter lab --- 确保 matplotlib cache 中有中文字体 --- vi ~/.matplotlib/fontlist-v330.json ---

    作者回复: 谢谢分享!!🎿

    2021-10-08
    4
    3
  • Allen
    感觉data = pd.concat([df_ads['浏览量'], df_ads['热度指数']], axis=1),这句可以用df_ads[['浏览量', '热度指数']]替代,看上去更简单一些

    作者回复: 对,对。 fig = sns.boxplot(x='热度指数', y="浏览量", data=df_ads[['浏览量', '热度指数']]) 这样就完全可以了。

    2021-09-26
    2
  • GAC·DU
    想到两个补值方法,我试了感觉都不是很好。第一个是取临近值,这种方法误差很大。第二个是利用对比标签值,反推特征值,这种方法适合小数据量,如果是大数据量很消耗机器性能。还请老师给出个完美的方案。

    作者回复: 嗯,非常好。大家都有自己的思考,我也有一个可能的想法,暂时先不分享给大家,让大家继续自由讨论。我过几天在分享这个想法。 补充一下,我的这个想法是对于转发数的空值,可以把同一行的“点赞数”拷贝到“转发数”中。因为这两个值接近。

    2021-09-03
    2
    2
收起评论
显示
设置
留言
29
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部