• reverse
    2019-03-06
    极客时间数据分析实战45讲的详细笔记(包含markdown、图片、思维导图 代码) github地址: https://github.com/xiaomiwujiecao/DataAnalysisInAction
    
     16
  • Geek_dancer
    2019-02-27
    默认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. 模型训练的准确率与人类水平之间偏差可以通过增加特征变量或采用新的训练模型来降低;模型训练的准确率与测试集测试的准确率之间的方差可以通过正则化,提高泛化性能等方式来降低。
    展开

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

    
     15
  • 滢
    2019-04-18
    利用SVM做分类,特征选择影响度大,要想SVM分类准确,人工处理数据这一步很重要

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

    
     4
  • mickey
    2019-02-26
    # 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
    展开
     1
     2
  • Rickie
    2019-02-05
    思考题:
    使用全部数据进行训练得到的准确率为0.9766,高于示例中的准确率。是否是由于多重共线性,使得测试结果偏高?

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

    
     2
  • Ronnyz
    2019-11-14
    选取全部特征:
    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;
    选取多特征的结果要好于选取少特征的结果
    展开

    作者回复: 对 一般是这个规律,具体还是要看数据集的分布情况,所以不同的模型之间没有绝对好坏之分,和数据集也有关系

    
     1
  • 明翼
    2019-11-10
    老师我利用了结果和特征的相关性,选择特征,发现结果更好:
    # 特征选择 按照结果和数据相关性选择特征准确率0.9707602339181286
    features_remain = ['radius_mean','perimeter_mean','area_mean','concave points_mean','radius_worst','perimeter_worst','area_worst','concave points_worst']

    作者回复: 不错的分享,从EDA中找到特征的关系,大家都可以看下

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

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

    
     1
  • third
    2019-02-18
    第二个,准确率 0.935672514619883。

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

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

    
     1
  • Python
    2019-02-04
    老师可以用PCA进行特征选择吗?如果可以,那和你这种手动的方法比有什么差别

    作者回复: 可以用PCA做特征选择,PCA相当于是降维工具,手动的可解释性会比较强

    
     1
  • 追梦
    2019-10-14
    老师,请问用什么方法可以判定数据集是否为线性可分的呢

    作者回复: 有两种方式,第一方式直接画图,可视化的方式呈现,是否具有线性的关系,另一种方式就是用线性可分的分类器来做分类,看下结果能否正确划分

    
    
  • chenzhenwei
    2019-09-25
    为什么LinearSVC使用所有的属性效果比使用六个不相关的属性好很多?
    
    
  • Geek_6a6ff8
    2019-07-26
    没有软间隔的代码吗?
     1
    
  • 夜路破晓
    2019-07-11
    features_mean=list(data.columns[2:12])
    这行报错:
    TypeError: 'DataFrame' object is not callable
    如何改善?

    作者回复: data = pd.read_csv("./data.csv")
    features_mean=list(data.columns[2:12])
    我刚才试了下,是可以的

    
    
  • 姜泮昌
    2019-06-06
    准备训练集和测试集的代码是否有问题?
    test_X= test[features_remain]
    这里应该是features_remain吧?
    
    
  • 张晓辉
    2019-05-19
    采用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-04-18
    语言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))
    展开

    作者回复: Good Job 滢

    
    
  • 王彬成
    2019-04-02
    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
    展开

    作者回复: Good Job

    
    
  • 圆圆的大食客
    2019-03-18
    # -*- 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))


    展开

    作者回复: Good Job

    
    
  • 叮当猫
    2019-03-16
    通过多次运行,发现每次结果也不太一样,但是大体上,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')
    展开
    
    
我们在线,来聊聊吧