数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17179 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

23丨SVM(下):如何进行乳腺癌检测?

陈旸 2019-02-04
讲完了 SVM 的原理之后,今天我来带你进行 SVM 的实战。
在此之前我们先来回顾一下 SVM 的相关知识点。SVM 是有监督的学习模型,我们需要事先对数据打上分类标签,通过求解最大分类间隔来求解二分类问题。如果要求解多分类问题,可以将多个二分类器组合起来形成一个多分类器。
上一节中讲到了硬间隔、软间隔、非线性 SVM,以及分类间隔的公式,你可能会觉得比较抽象。这节课,我们会在实际使用中,讲解对工具的使用,以及相关参数的含义。

如何在 sklearn 中使用 SVM

在 Python 的 sklearn 工具包中有 SVM 算法,首先需要引用工具包:
from sklearn import svm
SVM 既可以做回归,也可以做分类器。
当用 SVM 做回归的时候,我们可以使用 SVR 或 LinearSVR。SVR 的英文是 Support Vector Regression。这篇文章只讲分类,这里只是简单地提一下。
当做分类器的时候,我们使用的是 SVC 或者 LinearSVC。SVC 的英文是 Support Vector Classification。
我简单说一下这两者之前的差别。
从名字上你能看出 LinearSVC 是个线性分类器,用于处理线性可分的数据,只能使用线性核函数。上一节,我讲到 SVM 是通过核函数将样本从原始空间映射到一个更高维的特质空间中,这样就使得样本在新的空间中线性可分。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(27)

  • reverse
    极客时间数据分析实战45讲的详细笔记(包含markdown、图片、思维导图 代码) github地址: https://github.com/xiaomiwujiecao/DataAnalysisInAction
    2019-03-06
    14
  • Geek_dancer
    默认SVC训练模型,6个特征变量,训练集准确率:96.0%,测试集准确率:92.4%
    默认SVC训练模型,10个特征变量,训练集准确率:98.7% ,测试集准确率:98.2%
    LinearSVC训练模型, 6个特征变量, 训练集准确率:93.9%,测试集准确率:92.3%
    LinearSVC训练模型, 10个特征变量, 训练集准确率:99.4%,测试集准确率:96.0%

    结论:
    1. 增加特征变量可以提高准确率,可能是因为模型维度变高,模型变得更加复杂。可以看出特征变量的选取很重要。
    2. 训练集拟合都比较好,但是测试集准确率出现不同程度的下降。
    3. 模型训练的准确率与人类水平之间偏差可以通过增加特征变量或采用新的训练模型来降低;模型训练的准确率与测试集测试的准确率之间的方差可以通过正则化,提高泛化性能等方式来降低。

    编辑回复: 赞下,不光做了练习,还做了分析总结。

    2019-02-27
    14
  • 利用SVM做分类,特征选择影响度大,要想SVM分类准确,人工处理数据这一步很重要

    编辑回复: 对的 特征选择,以及数据的处理都很重要。选择不同的特征,有时候比选择不同的分类算法更重要。

    2019-04-18
    4
  • mickey
    # encoding=utf-8
    from sklearn import svm
    from sklearn import metrics
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt

    # 加载数据集,你需要把数据放到目录中
    data = pd.read_csv("./data.csv")
    # 数据探索
    # 因为数据集中列比较多,我们需要把dataframe中的列全部显示出来
    pd.set_option('display.max_columns', None)
    #print(data.columns)
    #print(data.head(5))
    #print(data.describe())

    # 将特征字段分成3组
    features_mean= list(data.columns[2:12])
    features_se= list(data.columns[12:22])
    features_worst=list(data.columns[22:32])
    # 数据清洗
    # ID列没有用,删除该列
    data.drop("id",axis=1,inplace=True)
    # 将B良性替换为0,M恶性替换为1
    data['diagnosis']=data['diagnosis'].map({'M': 1, 'B': 0})

    # 特征选择
    features_remain = ['radius_mean', 'texture_mean', 'perimeter_mean',
           'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
           'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
           'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
           'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
           'fractal_dimension_se', 'radius_worst', 'texture_worst',
           'perimeter_worst', 'area_worst', 'smoothness_worst',
           'compactness_worst', 'concavity_worst', 'concave points_worst',
           'symmetry_worst', 'fractal_dimension_worst']

    # 抽取30%的数据作为测试集,其余作为训练集
    train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test
    # 抽取特征选择的数值作为训练和测试数据
    train_X = train[features_remain]
    train_y=train['diagnosis']
    test_X= test[features_remain]
    test_y =test['diagnosis']

    # 采用Z-Score规范化数据,保证每个特征维度的数据均值为0,方差为1
    ss = StandardScaler()
    train_X = ss.fit_transform(train_X)
    test_X = ss.transform(test_X)

    # 创建SVM分类器
    model = svm.LinearSVC()
    # 用训练集做训练
    model.fit(train_X,train_y)
    # 用测试集做预测
    prediction=model.predict(test_X)
    print('准确率: ', metrics.accuracy_score(prediction,test_y))

    准确率: 0.9707602339181286
    2019-02-26
    1
    2
  • Rickie
    思考题:
    使用全部数据进行训练得到的准确率为0.9766,高于示例中的准确率。是否是由于多重共线性,使得测试结果偏高?

    编辑回复: 如果选择全部的特征,一是运算量大,二是可能会过于拟合,造成实验中的准确率高,但是在实际工作中可能会存在偏差。

    2019-02-05
    2
  • Ronnyz
    选取全部特征:
    SVM分类器准确率: 0.9824561403508771
    cross_val_score的准确率为:0.9727
    linearSVM分类器的准确率: 0.9766081871345029
    cross_val_score的准确率为:0.9652

    选取mean相关特征:
    SVM分类器准确率: 0.9239766081871345
    cross_val_score的准确率为:0.9321
    linearSVM分类器的准确率: 0.9298245614035088
    cross_val_score的准确率为:0.9247

    数据结果上看:
    SVM的结果要好于linearSVM;
    选取多特征的结果要好于选取少特征的结果
    2019-11-14
    1
  • hlz-123
    首先要说,老师的课讲得非常好,深奥的算法和理论通过生动有趣的例子让人通俗易懂,兴趣盎然。
    老师的本课案例中,对特征数据都做了Z-Score规范化处理(正态分布),准确率在90%以上,如果数据不做规范化处理,准确率在88%左右,我的问题:
    1、数据规范化处理,是不是人为地提供了准确率?实际情况,数据不一定是正态分布。
    2、模型建好后,在实际应用中去评估某个案例时,该案例数据是不是也要规范化,这样做是不是很麻烦并且数据对比不是很直观呢?

    编辑回复: 1、首先需要理解数据规范化的意义,当我们在做数据挖掘之前,不同的指标可能具有不同的量纲,如果我们不消除这些指标之间的取值范围差别,以及不同量纲所造成的影响的话,就会影响到后续数据分析(分类、聚类等)的结果。因此我们需要进行规范化处理,也就是让数据按照一定的标准落入到一个特定的区间内,便于我们后续分析使用。
    2、在做处理的时候,训练集和测试集都需要进行数据规范化,其实在代码上并不麻烦,而且这么做属于数据挖掘前的一项基础工作。

    2019-03-16
    1
  • third
    第二个,准确率 0.935672514619883。

    感觉还蛮好用的,只是不是很熟练的使用各个算法做分类和回归

    编辑回复: 挺好的,慢慢来,做的多了就好了!

    2019-02-18
    1
  • Python
    老师可以用PCA进行特征选择吗?如果可以,那和你这种手动的方法比有什么差别
    2019-02-04
    1
  • 明翼
    老师我利用了结果和特征的相关性,选择特征,发现结果更好:
    # 特征选择 按照结果和数据相关性选择特征准确率0.9707602339181286
    features_remain = ['radius_mean','perimeter_mean','area_mean','concave points_mean','radius_worst','perimeter_worst','area_worst','concave points_worst']
    2019-11-10
    2
  • 追梦
    老师,请问用什么方法可以判定数据集是否为线性可分的呢
    2019-10-14
  • chenzhenwei
    为什么LinearSVC使用所有的属性效果比使用六个不相关的属性好很多?
    2019-09-25
  • Geek_6a6ff8
    没有软间隔的代码吗?
    2019-07-26
    1
  • 夜路破晓
    features_mean=list(data.columns[2:12])
    这行报错:
    TypeError: 'DataFrame' object is not callable
    如何改善?
    2019-07-11
  • 姜泮昌
    准备训练集和测试集的代码是否有问题?
    test_X= test[features_remain]
    这里应该是features_remain吧?
    2019-06-06
  • 张晓辉
    采用linearSVC, 预测准确率更高。
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn import svm
    from sklearn.metrics import accuracy_score
    from sklearn.preprocessing import StandardScaler

    data = pd.read_csv('data.csv')
    data.drop('id', axis=1, inplace=True)

    feature_names = list(data.columns)
    feature_names.remove('diagnosis')

    traindata, testdata = train_test_split(data, test_size=0.3)
    train_x = traindata[feature_names]
    train_y = traindata['diagnosis']
    test_x = testdata[feature_names]
    test_y = testdata['diagnosis']

    ss = StandardScaler()
    train_x = ss.fit_transform(train_x)
    test_x = ss.transform(test_x)
                        
    model = svm.LinearSVC()
    model.fit(train_x, train_y)
    prediction = model.predict(test_x)
    print("The accuracy is %f" % accuracy_score(prediction, test_y))
    2019-05-19
  • 语言Python3.6 没有z-score规范化数据以及规范化后两种情况前提预测准确率,使用LinearSVC,选取所有mean属性

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.model_selection import train_test_split
    from sklearn import svm
    from sklearn import metrics
    from sklearn.preprocessing import StandardScaler

    #导入数据
    path = '/Users/apple/Desktop/GitHubProject/Read mark/数据分析/geekTime/data/'
    data = pd.read_csv(path + 'breast_cancer/data.csv')

    #数据探索
    pd.set_option('display.max_columns', None)
    print(data.columns)
    print(data.head(5))
    print(data.describe())

    #将特征字段进行分组
    features_mean = list(data.columns[2:12])
    features_se = list(data.columns[12:22])
    features_worst = list(data.columns[22:32])

    #数据清洗
    #删除ID列
    data.drop('id',axis=1,inplace=True)
    #将良性B替换为0,将恶性替换为1
    data['diagnosis'] = data['diagnosis'].map({'B':0,'M':1})

    #将肿瘤诊断结果可视化
    sns.countplot(data['diagnosis'],label='count')
    plt.show()
    #计算相关系数
    corr = data[features_mean].corr()
    plt.figure(figsize=(14,14))

    #用热力图呈现相关性,显示每个方格的数据
    sns.heatmap(corr,annot=True)
    plt.show()

    #特征选择,选择所有的mean数据
    feature_remain = ['radius_mean', 'texture_mean', 'perimeter_mean',
           'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
           'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean']

    #抽取30%特征选择作为测试数据,其余作为训练集
    train,test = train_test_split(data,test_size=0.3)
    #抽取特征选择作为训练和测试数据
    train_data = train[feature_remain]
    train_result = train['diagnosis']
    test_data = test[feature_remain]
    test_result = test['diagnosis']

    #创建SVM分类器
    model = svm.LinearSVC()
    #用训练集做训练
    model.fit(train_data,train_result)
    #用测试集做预测
    prediction = model.predict(test_data)
    #准确率
    print('准确率:', metrics.accuracy_score(prediction,test_result))

    #规范化数据,再预估准确率
    z_score = StandardScaler()
    train_data = z_score.fit_transform(train_data)
    test_data = z_score.transform(test_data)
    #用新数据做训练
    new_model = svm.LinearSVC()
    new_model.fit(train_data,train_result)
    #重新预测
    new_prediction = new_model.predict(test_data)
    #准确率
    print('准确率:',metrics.accuracy_score(new_prediction,test_result))
    2019-04-18
  • 王彬成
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn import svm
    from sklearn import metrics

    # 加载数据集,你需要把数据放到目录中
    data = pd.read_csv("./breast_cancer_data-master/data.csv")

    # 数据探索
    # 因为数据集中列比较多,我们需要把 dataframe 中的列全部显示出来
    pd.set_option('display.max_columns', None)
    print(data.columns)
    print(data.head(5))
    print(data.describe())

    # 将特征字段分成 3 组
    features_mean= list(data.columns[2:12])
    features_se= list(data.columns[12:22])
    features_worst=list(data.columns[22:32])

    # 数据清洗
    # ID 列没有用,删除该列
    data.drop("id",axis=1,inplace=True)
    # 将 B 良性替换为 0,M 恶性替换为 1
    data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})

    # 将肿瘤诊断结果可视化
    sns.countplot(data['diagnosis'],label="Count")
    plt.show()
    # 用热力图呈现 features_mean 字段之间的相关性
    corr = data[features_mean].corr()
    plt.figure(figsize=(14,14))
    # annot=True 显示每个方格的数据
    sns.heatmap(corr, annot=True)
    plt.show()

    # 特征选择
    #features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']
    features_remain = data.columns[1:31]
    print(features_remain)
    print('-'*100)

    # 抽取 30% 的数据作为测试集,其余作为训练集
    train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test
    # 抽取特征选择的数值作为训练和测试数据
    train_X = train[features_remain]
    train_y=train['diagnosis']
    test_X= test[features_remain]
    test_y =test['diagnosis']

    # 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1
    ss = StandardScaler()
    train_X = ss.fit_transform(train_X)
    test_X = ss.transform(test_X)


    # 创建 SVM 分类器
    model = svm.LinearSVC()
    # 用训练集做训练
    model.fit(train_X,train_y)
    # 用测试集做预测
    prediction=model.predict(test_X)
    print('准确率: ', metrics.accuracy_score(prediction,test_y))

    ------
    准确率: 0.9649122807017544
    2019-04-02
  • 圆圆的大食客
    # -*- coding: utf-8 -*-
    """
    Created on Sun Mar 17 23:18:31 2019

    @author: xcma1
    """
     
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn import metrics

    # 加载数据集,你需要把数据放到目录中
    data = pd.read_csv("./data.csv")
    # 数据探索
    # 因为数据集中列比较多,我们需要把 dataframe 中的列全部显示出来
    pd.set_option('display.max_columns', None)
    # 将特征字段分成 3 组
    features_mean= list(data.columns[2:12])
    features_se= list(data.columns[12:22])
    features_worst=list(data.columns[22:32])
    # 数据清洗

    # ID 列没有用,删除该列
    data.drop("id",axis=1,inplace=True)

    # 将 B 良性替换为 0,M 恶性替换为 1
    data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})

    # 特征选择
    features_remain = ['radius_mean', 'texture_mean', 'perimeter_mean',
           'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
           'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
           'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
           'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
           'fractal_dimension_se', 'radius_worst', 'texture_worst',
           'perimeter_worst', 'area_worst', 'smoothness_worst',
           'compactness_worst', 'concavity_worst', 'concave points_worst',
           'symmetry_worst', 'fractal_dimension_worst']

    # 抽取 30% 的数据作为测试集,其余作为训练集
    train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test

    # 抽取特征选择的数值作为训练和测试数据
    train_X = train[features_remain]
    train_y=train['diagnosis']
    test_X= test[features_remain]
    test_y =test['diagnosis']

    # 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1
    ss = StandardScaler()
    train_X = ss.fit_transform(train_X)
    test_X = ss.transform(test_X)

    # 创建 SVM 分类器
    model = svm.SVC()
    # 用训练集做训练
    model.fit(train_X,train_y)
    # 用测试集做预测
    prediction=model.predict(test_X)
    print('准确率: ', metrics.accuracy_score(prediction,test_y))


    2019-03-18
  • 叮当猫
    通过多次运行,发现每次结果也不太一样,但是大体上,svc的效果好于linearsvc,多特征好于少特征。

    附代码如下:
    #-coding=utf-8
    from sklearn import svm
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn import metrics

    def train_func(func, features_remain, desc):
        #分类阶段:模型训练
        #抽取30%的数据作为测试集,其余作为训练集
        train, test = train_test_split(data, test_size=0.3)
        train_x = train[features_remain]
        train_y = train['diagnosis']
        test_x = test[features_remain]
        test_y = test['diagnosis']

        ss = StandardScaler()
        train_x = ss.fit_transform(train_x)
        test_x = ss.transform(test_x)

        #创建SVM分类器
        if(func == "linear"):
            model = svm.LinearSVC()
        else:
            model = svm.SVC()
        #用训练集做训练
        model.fit(train_x, train_y)
        #用测试集做预测

        #分类阶段:模型评估
        predict_y = model.predict(test_x)
        infos1 = "测试集准确率:" + str(metrics.accuracy_score(predict_y, test_y))

        predict_yy = model.predict(train_x)
        infos2 = "训练集准确率:" + str(metrics.accuracy_score(predict_yy, train_y))
        print desc + ":" + infos1 + " " + infos2


    #准备阶段:数据探索
    data = pd.read_csv('./breast_cancer_data-master/data.csv')
    #把所有的列都显示出来(在打印的时候)
    pd.set_option('display.max_columns', None)

    features_mean = list(data.columns[2:12])
    features_se = list(data.columns[12:22])
    features_worst = list(data.columns[22:32])

    #准备阶段:数据清洗,id列没有用,删除该列
    data.drop("id", axis=1, inplace=True)

    #准备阶段:数据可视化
    sns.countplot(data['diagnosis'], label='Count')
    plt.show()
    corr = data[features_mean].corr()
    plt.figure(figsize=(14,14))
    sns.heatmap(corr, annot=True)
    plt.show()

    #分类阶段:特征选择
    features_remain = ['radius_mean', 'texture_mean', 'smoothness_mean', 'compactness_mean', 'symmetry_mean', 'fractal_dimension_mean']

    #分类阶段:模型训练+模型评估
    train_func('svc', features_remain, 'svc_six')
    train_func('svc', features_mean, 'svc_all')
    train_func('linear', features_remain, 'linearsvc_six')
    train_func('linear', features_mean, 'linearsvc_all')
    2019-03-16
收起评论
27
返回
顶部