sklearn之svm-葡糖酒質量預測(1)

1.基礎python

支持向量機(SVMs)是一套用於分類、迴歸和異常值檢測的監督學習方法。正則表達式

支持向量機的優勢是:數組

在高維空間中有效。
在維度數量大於樣本數量的狀況下仍然有效。
在決策函數中使用一個訓練點子集(稱爲支持向量),所以它也是內存高效的。
通用的:能夠爲決策函數指定不一樣的內核函數。提供了通用的內核,但也能夠指定定製的內核。
支持向量機的缺點包括:app

若是特徵數遠大於樣本數,則在選擇核函數時避免過擬合,正則項相當重要。
若是特徵數遠大於樣本數,則在選擇核函數時避免過擬合,正則項相當重要。
SVMs不直接提供機率估計,這些估計是使用昂貴的五倍交叉驗證
scikit-learn中的支持向量機既支持密集(numpy)又支持密集(numpy)。ndarray和可轉換爲它的numpy.asarray)和稀疏(任何scipy.稀疏)樣本向量做爲輸入。然而,要使用支持向量機對稀疏數據進行預測,它必須與這些數據相匹配。爲了得到最佳性能,請使用C-ordered numpy。ndarray(稠密)或scipy.稀疏。csrmatrix(稀疏),dtype=float64。
SVC和NuSVC是類似的方法,但接受的參數集略有不一樣,有不一樣的數學公式(見數學公式部分)。另外一方面,LinearSVC是線性核狀況下支持向量分類的另外一種實現。注意,LinearSVC不接受關鍵字kernel,由於這被認爲是線性的。它也缺乏一些SVC和NuSVC成員,好比support

做爲其餘分類器,SVC、NuSVC和LinearSVC以兩個數組做爲輸入:一個大小爲[n_samples, n_features]的數組X和一個類別標籤(字符串或整數)的數組y,大小爲[n_samples]:dom

from sklearn import svm
X = [[0, 0], [1, 1]]
y = [0, 1]
clf = svm.SVC(gamma='scale')
clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

基礎
模型擬合後,可用於預測新的值:ide

>>> clf.predict([[2., 2.]])
array([1])

SVMs決策函數依賴於訓練數據的某個子集,稱爲支持向量。這些支持向量的一些屬性能夠在supportvectors、support_和n_support成員中找到:函數

# get support vectors
clf.support_vectors_
​
array([[0., 0.],
       [1., 1.]])
# get indices of support vectors
clf.support_ 
array([0, 1], dtype=int32)
 # get number of support vectors for each class
clf.n_support_
array([1, 1], dtype=int32)

SVC和NuSVC實現了「one-against-one」方法(Knerr et al., 1990)用於多類分類。若是n_class是類的數量,則構造n_class * (n_class - 1) / 2分類器,每一個分類器訓練來自兩個類的數據。爲了與其餘分類器提供一致的接口,decision_function_shape選項容許將「一對一」分類器的結果聚合到shape的決策函數(n_samples, n_classes):工具

>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(gamma='scale', decision_function_shape='ovo')
>>> clf.fit(X, Y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovo', degree=3, gamma='scale', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4

另外一方面,LinearSVC實現「一vs其餘」多類策略,從而訓練n_class模型。若是隻有兩個類,只培訓一個模型:佈局

>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y) 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='squared_hinge', max_iter=1000,
     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0)
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4

注意,LinearSVC還使用multi_class='crammer_singer'選項實現了另外一種多類策略,即Crammer和Singer制定的所謂多類支持向量機。這種方法是一致的,但對於one-vs-rest分類則不是這樣。在實踐中,一般首選1 -vs-rest分類,由於結果大部分是類似的,可是運行時要少得多。性能

對於「one-vs-rest」LinearSVC的屬性coef_和intercept_分別具備形狀[n_class、n_features]和[n_class]。係數的每一行都對應於n_class中的一個「one-vs-rest」分類器,對於截取程序也相似,順序是「one」類。

在「one vs-one」SVC中,屬性的佈局要稍微複雜一些。在具備線性內核的狀況下,屬性coef_和intercept_分別具備[n_class (n_class - 1) / 二、n_features]和[n_class (n_class - 1) / 2]。這與上面描述的LinearSVC的佈局相似,每一行對應一個二進制分類器。0到n的順序是「0 vs 1」、「0 vs 2」、「0 vs n」、「1 vs 2」、「1 vs 3」、「1 vs n」……「n - 1與n」。

dual_coef_的形狀是[n_class-1, n_SV],佈局有點難以把握。列對應於任何n_class * (n_class - 1) / 2「one-vs-one」分類器中涉及的支持向量。在n_class - 1分類器中使用每一個支持向量。每一行中的n_class - 1項對應於這些分類器的對偶係數。

from sklearn import svm
clf = svm.LinearSVC()
x = [[0.], [1.], [0.2], [1.]]
y = [0,1,0,1] #5*x-2>0
clf.fit(x,y)
clf.predict([[0.3], [2.]])

線性svm分類:(5x-2>0=>1 | 5x-2<0=>0)

array([0, 1])

非線性SVM分類

import numpy as np
from sklearn import svm
clf = svm.SVC(gamma='scale')
x=np.random.random(size=(50,1))
y=5*pow(x,2)+3>5
clf.fit(x,y.ravel())
x_test=np.random.random(size=(5,1))
y_test=5*pow(x_test,2)+3>5
y_pred=clf.predict(x_test)
print y_pred
print y_test
[False  True False  True False]
[[False]
 [ True]
 [False]
 [ True]
 [False]]

讀取csv

import pandas as pd
df_list=[]
for df in pd.read_csv(
    "winequality-white.csv",
    sep=';',
    encoding="utf-8",
    chunksize=200,
    usecols=["fixedacidity","volatileacidity","citricacid","residualsugar","chlorides","freesulfurdioxide","totalsulfurdioxide","density","pH","sulphates","alcohol","quality"]
):
    df_list.append(df)
print df_list
[     fixedacidity  volatileacidity  citricacid  residualsugar  chlorides  \
0             6.6            0.170        0.38           1.50      0.032   
1             6.3            0.480        0.04           1.10      0.046   
2             6.2            0.660        0.48           1.20      0.029   
3             7.4            0.340        0.42           1.10      0.033   
4             6.5            0.310        0.14           7.50      0.044   
5             6.2            0.660        0.48           1.20      0.029   
6             6.5            0.390        0.23           5.40      0.051   
7             7.0            0.330        0.32           1.20      0.053   
...
...
...
import pandas as pd
import StringIO
x="name,age,y\n'zhangsang',32,1\n'lisi',29,2\n'wangwu',30,1"
pd.read_csv(StringIO.StringIO(x))#StringIO — Read and write strings as files

在這裏插入圖片描述
當指定爲dtype (GH10153)時,read_csv()函數如今支持解析類別(Categorical)列。根據數據的結構不一樣,與解析後轉換爲category的方法相比,這會致使更快的解析時間和更低的內存使用量。請參閱這裏的io文檔。

import pandas as pd
import StringIO
x="name,age,y\n'zhangsang',32,1\n'lisi',29,2\n'wangwu',30,1"
pd.read_csv(StringIO.StringIO(x))#StringIO — Read and write strings as files
pd.read_csv(StringIO.StringIO(x), dtype='category').dtypes
name    category
age     category
y       category
dtype: object
import pandas as pd
import StringIO
x="name,age,y\n'zhangsang',32,1\n'lisi',29,2\n'wangwu',30,1"
pd.read_csv(StringIO.StringIO(x))#StringIO — Read and write strings as files
pd.read_csv(StringIO.StringIO(x), dtype={'y': 'category'}).dtypes
name      object
age        int64
y       category
dtype: object
>>>df["y"].cat.categories
Index([u'1', u'2'], dtype='object')

>>>pd.to_numeric(df["y"].cat.categories)
Int64Index([1, 2], dtype='int64')

繼續讀取csv基礎

import pandas as pd
import StringIO
x="name,age,y\n'zhangsang',32,1\n'lisi',29,2\n'wangwu',30,1"
df=pd.read_csv(StringIO.StringIO(x), dtype={'y': 'category'})
df["name"],df["y"]
(0    'zhangsang'
 1         'lisi'
 2       'wangwu'
 Name: name, dtype: object, 0    1
 1    2
 2    1
 Name: y, dtype: category
 Categories (2, object): [1, 2])
pandas.read_csv(filepath_or_buffer, sep=’, ’, delimiter=None, header=’infer’, names=None, in- dex_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compres- sion=’infer’, thousands=None, decimal=b’.’, lineterminator=None, quotechar=’"’, quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, dou- blequote=True, delim_whitespace=False, low_memory=True, memory_map=False,
float_precision=None)

Read CSV (comma-separated) file into DataFrame
還支持可選地迭代或分割文件爲塊。
panda I/O API是一組頂級讀取器函數,如pandas.read_csv(),一般返回一個panda對象。相應的writer函數是對象方法,能夠像DataFrame.to_csv()那樣訪問。下面是一個包含可用readers 和 writers的表。
在這裏插入圖片描述
參數
filepath_or_buffer [str, pathlib.Path, py._path.local.LocalPath or any ]
具備read()方法的對象(如文件句柄或StringIO)
字符串能夠是URL。有效的URL方案包括http、ftp、s3和文件。對於文件url,須要一臺主機。例如,一個本地文件能夠是 file://localhost/path/to/table. csv

sep : str, default ‘,’分隔符使用。若是sep爲空,C引擎沒法自動檢測分離器,可是Python解析引擎能夠,這意味着後者將被自動使用。經過Python的內置嗅探工具csv.Sniffer檢測分離器。此外,與'\s+'不一樣,大於1個字符的sep- arators將被解釋爲正則表達式,並將強制使用Python解析引擎。注意,regex分隔符很容易忽略引用的數據。正則表達式的例子:「\ r \ t」delimiter : str, default Nonesep的替代參數名。delim_whitespace : boolean, default False指定是否使用空格(例如。' '或'\t')將用做sep.等效於設置sep='\s+'。若是將此選項設置爲True,則不該該爲分隔符參數傳遞任何內容。0.18.1版的新特性:對Python解析器的支持。header : int or list of ints, default ‘infer’行號(行數)要用做列名和數據的頭。默認值是- havior,用於推斷列名:若是沒有傳遞列名,則行爲與header=0相同,而且從文件的第一行推斷列名,若是顯式傳遞列名,則行爲與header=None相同。顯式傳遞header=0以替換現有名稱。頭能夠是一個整數列表,它爲列上的多個索引指定行位置,例如[0,1,3]。未指定的中間行將被跳過(例如,例如本例中跳過了2)。注意,若是skip_blank_lines=True,則該參數將忽略註釋的行和空行,所以header=0表示數據的第一行,而不是文件的第一行。names : array-like, default None要使用的列名列表。若是文件不包含頭行,那麼應該顯式地執行經過header = None。此列表中的重複項將致使發出用戶警告。index_col : int or sequence or False, default None要用做DataFrame的行標籤的列。若是給定一個序列,則使用一個多索引。若是在每行末尾有一個帶分隔符的格式不正確的文件,那麼能夠考慮使用index_col=False強制panda _not_使用第一列做爲索引(行名)usecols : list-like or callable, default None返回列的子集。若是相似於列表,則全部元素必須是位置的(即文檔列中的整數索引),或者是與用戶提供的列名相對應的字符串,或者是從文檔頭行推斷出來的。例如,一個有效的類列表的usecols參數將是[0,1,2]或[' foo ', ' bar ', ' baz ']。元素順序被忽略,因此usecols=[0,1]與[1,0]相同。用保留的順序從data實例化DataFrame元素pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']]按照['foo', 'bar']的列順序,或pd.read_csv(data, usecols=['foo', 'bar'])[['bar', 'foo']]for['bar', 'foo']的順序若是可調用,可調用函數將根據列名求值,返回可調用函數求值爲True時的名稱。一個有效的可調用參數的例子是['AAA', 'BBB', 'DDD']中的lambda x: x.upper()。使用這個參數會致使更快的解析時間和更低的內存使用。squeeze : boolean, default False若是解析後的數據只包含一列,則返回一個系列prefix : str, default None在沒有標題的狀況下向列數添加前綴,例如「X」表示X0、X一、…mangle_dupe_cols : boolean, default True重複列將被指定爲‘X’, ‘X.1’, . . . ’X.N’,而不是‘X’. . . ’X’。若是列中有重複的名稱,則False中的傳遞將致使數據覆蓋。dtype : Type name or dict of column -> type, default None數據或列的數據類型。{‘a’: np.float64, ‘b’: np.int32},使用str或對象以及適當的na_values設置來保存和不解釋dtype。若是指定了轉換器,將應用dtype轉換的INSTEAD。engine : {‘c’, ‘python’}, optional要使用的解析器引擎。C引擎更快,而python引擎目前功能更完備。converters : dict, default None用於轉換某些列中的值的函數的字典。鍵能夠是整數,也能夠是列標籤

相關文章
相關標籤/搜索