Advertisement

【Scikit-Learn】SVM检测乳腺癌

阅读量:

分别使用SVC类的高斯核函数及多项式核函数对乳腺癌数据集进行分类,并绘制学习曲线。

最后使用多项式特征,并使用LinearSVC进行处理。(针对多项式特征,LinearSVC类比SCV类速度更快)。

1. 载入数据

复制代码
    %matplotlib inline
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 载入数据
    from sklearn.datasets import load_breast_cancer
    
    cancer = load_breast_cancer()
    X = cancer.data
    y = cancer.target
    print('data shape: {0}; no. positive: {1}; no. negative: {2}'.format(
    X.shape, y[y==1].shape[0], y[y==0].shape[0]))
    '''
    data shape: (569, 30); no. positive: 357; no. negative: 212
    ''' 
    
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

2. 使用高斯核函数

由于高斯核函数太复杂,容易造成过拟合,模型容易过拟合。

复制代码
    from sklearn.svm import SVC
    
    clf = SVC(C=1.0, kernel='rbf', gamma=0.1)
    clf.fit(X_train, y_train)
    train_score = clf.score(X_train, y_train)
    test_score = clf.score(X_test, y_test)
    print('train score: {0}; test score: {1}'.format(train_score, test_score))
    '''
    train score: 1.0; test score: 0.526315789474
    '''
    
      
      
      
      
      
      
      
      
      
      
    
    代码解释

使用GridSearchCV类自动选择最优的gamma值

复制代码
    from common.utils import plot_param_curve
    from sklearn.model_selection import GridSearchCV
    
    gammas = np.linspace(0, 0.0003, 30)
    param_grid = {'gamma': gammas}
    clf = GridSearchCV(SVC(), param_grid, cv=5)
    clf.fit(X, y)
    print("best param: {0}\nbest score: {1}".format(clf.best_params_,
                                                clf.best_score_))
    
    plt.figure(figsize=(10, 4), dpi=144)
    plot_param_curve(plt, gammas, clf.cv_results_, xlabel='gamma')
    '''
    best param: {'gamma': 0.00011379310344827585}
    best score: 0.936731107206
    '''
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

这里写图片描述
绘画gamma=0.01时的学习曲线

复制代码
    import time
    from common.utils import plot_learning_curve
    from sklearn.model_selection import ShuffleSplit
    
    cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)
    title = 'Learning Curves for Gaussian Kernel'
    
    start = time.clock()
    plt.figure(figsize=(10, 4), dpi=144)
    plot_learning_curve(plt, SVC(C=1.0, kernel='rbf', gamma=0.01),
                    title, X, y, ylim=(0.5, 1.01), cv=cv)
    
    print('elaspe: {0:.6f}'.format(time.clock()-start))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
这里写图片描述

3. 使用多项式核函数

复制代码
    from sklearn.svm import SVC
    
    clf = SVC(C=1.0, kernel='poly', degree=2)  # 使用二阶多项式核函数
    clf.fit(X_train, y_train)
    train_score = clf.score(X_train, y_train)
    test_score = clf.score(X_test, y_test)
    print('train score: {0}; test score: {1}'.format(train_score, test_score))
    '''
    train score: 0.978021978022; test score: 0.947368421053
    '''
    
      
      
      
      
      
      
      
      
      
      
    
    代码解释

画出1、2阶多项式核函数SVM的学习曲线

复制代码
    import time
    from common.utils import plot_learning_curve
    from sklearn.model_selection import ShuffleSplit
    
    cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    title = 'Learning Curves with degree={0}'
    degrees = [1, 2]
    
    start = time.clock()
    plt.figure(figsize=(12, 4), dpi=144)
    for i in range(len(degrees)):
    plt.subplot(1, len(degrees), i + 1)
    plot_learning_curve(plt, SVC(C=1.0, kernel='poly', degree=degrees[i]),
                        title.format(degrees[i]), X, y, ylim=(0.8, 1.01), cv=cv, n_jobs=4)
    
    print('elaspe: {0:.6f}'.format(time.clock()-start))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
这里写图片描述

4. 使用多项式特征和LinearSVC模型

LinearSVC:与参数kernel =’linear’的SVC类似,但是以liblinear而不是libsvm的形式实现,因此它在惩罚和损失函数的选择方面具有更大的灵活性,并且应该更好地扩展到大量样本。

复制代码
    from sklearn.svm import LinearSVC
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.pipeline import Pipeline
    
    def create_model(degree=2, **kwarg):
    polynomial_features = PolynomialFeatures(degree=degree,
                                             include_bias=False)
    scaler = MinMaxScaler()
    linear_svc = LinearSVC(**kwarg)
    pipeline = Pipeline([("polynomial_features", polynomial_features),
                         ("scaler", scaler),
                         ("linear_svc", linear_svc)])
    return pipeline
    
    
    clf = create_model(penalty='l1', dual=False)
    clf.fit(X_train, y_train)
    train_score = clf.score(X_train, y_train)
    test_score = clf.score(X_test, y_test)
    print('train score: {0}; test score: {1}'.format(train_score, test_score))
    '''
    train score: 0.984615384615; test score: 0.991228070175
    '''
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

使用1、2阶多项式特征训练LinearSVC模型,并画出学习曲线。

复制代码
    import time
    from common.utils import plot_learning_curve
    from sklearn.model_selection import ShuffleSplit
    
    cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    title = 'Learning Curves for LinearSVC with Degree={0}'
    degrees = [1, 2]
    
    start = time.clock()
    plt.figure(figsize=(12, 4), dpi=144)
    for i in range(len(degrees)):
    plt.subplot(1, len(degrees), i + 1)
    plot_learning_curve(plt, create_model(penalty='l1', dual=False, degree=degrees[i]),
                        title.format(degrees[i]), X, y, ylim=(0.8, 1.01), cv=cv)
    
    print('elaspe: {0:.6f}'.format(time.clock()-start))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
这里写图片描述

全部评论 (0)

还没有任何评论哟~