1. 程式人生 > >Kaggle新手入門之路(完結)

Kaggle新手入門之路(完結)

閱讀目錄

學完了Coursera上Andrew Ng的Machine Learning後,迫不及待地想去參加一場Kaggle的比賽,卻發現從理論到實踐的轉變實在是太困難了,在此記錄學習過程.

 

回到頂部

一:安裝Anaconda

教程大多推薦使用Jupyter Notebook來進行資料科學的相關程式設計,我們通過Anaconda來安裝Jupyter Notebook和需要用到的一些python庫,按照以下方法重新安裝了Anaconda,平臺Win10

Anaconda安裝

回到頂部

二:Jupyter Notebook

參照以下兩篇文章配置好了Jupyter Notebook,學習了相關的基本操作

Jupyter可以做哪些事情

Jupyter Notebook常用快捷鍵

  • 啟動:在cmd或Anaconda Prompt下輸入jupyter notebook
  • 新建:Files頁面右側'New'
  • 運行當前cell:Ctrl+Enter
  • 程式碼補全:Tab
  • 檢視方法文件:Shift+Tab
  • 複選cell:Shift+上下鍵
  • 刪除cell:雙擊D
  • 撤銷刪除:Z
  • 儲存當前Notebook:S
  • 關閉文件:Home頁面選中文件後'Shutdown'
  • 關閉伺服器:終端中按兩次Ctrl+C
  • 顯示matplotlib圖表:%matplotlib inline
  • 中斷執行:I

回到頂部

三:Numpy

numpy中文教程

官方文件

  • Numpy是一個用於進行陣列運算的庫
  • Numpy中最重要的物件是稱為ndarray的N維陣列型別
  • 一般使用如下語句匯入:import numpy as np
  • 建立陣列:numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
  • 可以用np.dtype()定義結構體
  • 陣列維度:ndarray.shape
  • 陣列維數:ndarray.ndim
  • 調整陣列維度:ndarray.reshape(shape)
  • 建立未初始化陣列:numpy.empty(shape, dtype = float, order = 'C')
  • 建立零陣列:numpy.zeros(shape, dtype = float, order = 'C')
  • 建立一陣列:numpy.ones(shape, dtype = float, order = 'C')
  • 用現有資料建立陣列:numpy.asarray(a, dtype = None, order = None)
  • 按數值範圍建立陣列:numpy.arange(start = 0, stop, step = 1, dtype),類似的有linspace()和logspace()
  • 切片:b=a[start:stop:step],可以用...代表剩餘維度
  • 整數索引:每個整數陣列表示該維度的下標值,b=a[[r1, r2], [c1, c2]]
  • 布林索引:返回是布林運算的結果的物件,可以用&或|連線()分隔的條件
  • 在 NumPy 中可以對形狀不相似的陣列進行操作,因為它擁有廣播功能,我的理解是,廣播是一種維度的單方向拉伸
  • 陣列迭代:numpy.nditer(ndarray)或ndarray.flat
  • 陣列長度:len(arr)
  • 訪問第i個元素:一維陣列用a[i],多維陣列用a.flat[i]
  • 陣列轉置:ndarray.T
  • 陣列分割:numpy.split(ary, indices_or_sections, axis),第二項的值為整數則表明要建立的等大小的子陣列的數量,是一維陣列則表明要建立新子陣列的點。
  • 追加值:numpy.append(arr, values, axis)
  • 插入值:numpy.insert(arr, idx, values, axis)
  • 刪除值:numpy.delete(arr, values, axis)
  • 去重陣列:numpy.unique(arr, return_index, return_inverse, return_counts)
  • 字串函式:numpy.char類
  • 三角函式:numpy.sin(arr),numpy.cos(arr),numpy.tan(arr)
  • 四捨五入:numpy.around(arr,decimals)
  • 向下取整:numpy.floor(arr)
  • 向上取整:numpy.ceil(arr)
  • 取倒數:numpy.reciprocal(arr),注意對於大於1的整數返回值為0
  • 冪運算:numpy.power(arr,pow),pow可以是一個數,也可以是和arr對應的陣列
  • 取餘:numpy.mod(a,b),b可以是一個數,也可以是和a對應是陣列
  • 最小值:numpy.amin(arr,axis)
  • 最大值:numpy.amax(arr,axis)
  • 數值跨度:numpy.ptp(arr,axis)
  • 算術平均值:numpy.mean(arr,axis)
  • 標準差:numpy.std(arr)
  • 方差:numpy.var(arr)
  • 副本的改變會影響原陣列(賦值),檢視的改變不會影響原陣列(ndarray.view(),切片,ndarray.copy())
  • 線性代數:numpy.linalg模組

回到頂部

四:Matplotlib

官方教程

官方教程中文翻譯

matplotlib入門教程

Jupyter Notebook Viewer的matplotlib lecture 

建議先看官方教程,通過折線圖熟悉基本操作,然後看入門教程第三章到第六章掌握各種圖的畫法

 

  • 一般使用如下語句匯入:import matplotlib.pyplot as plt
  • 繪圖:plt.plot(x,y),可選color,marker,label等引數,預設的x座標為從0開始且與y長度相同的陣列,x座標與y座標一般使用numpy陣列,也可以用列表
  • 設定線條:plt.setp()
  • 軸名稱:plt.xlable('str'),plt.ylable('str)
  • 新增文字:plt.txt(xpos,ypos,'str')
  • 新增格子:plt.grid(True)
  • 展示圖片:plt.show()
  • 圖題:plt.title('str')
  • 圖示:plt.legend(),結合plot()中的label引數使用
  • 獲取子圖:plt.sublot(nrows,ncols,index)或plt.subplot2grid((nrows,ncols),(rows,cols)),可選colspan和rowspan屬性
  • 建立畫布:plt.figure()
  • 數學表示式:TeX表示式
  • 非線性軸:plt.xscale('scale'),plt.yscale('scale'),可選引數log,symlog,logit等
  • 填充顏色:plt.fill(x,y)和plt.fill_between(x,y,where=...)
  • 條形圖:plt.bar(x,y),注意多個條形圖的預設顏色相同,應選擇不同的顏色方便區分
  • 直方圖:plt.hist(x,bins),直方圖是一種顯示區段內資料數量的影象,x為資料,bins為資料區段,可選histtype,rwidth等屬性
  • 散點圖:plt.scatter(x,y),散點圖通常用於尋找相關性或分組,可選color,marker,label等屬性
  • 堆疊圖:plt.stackplot(x,y1,y2,y3...),堆疊圖用於顯示部分對整體隨時間的關係,通過利用plt.plot([],[],color,label)新增與堆疊圖中顏色相同的空行,可以使堆疊圖的意義更加清晰,可選colors等屬性
  • 餅圖:plt.pie(slice),餅圖用於顯示部分對整體的關係,可選labels,colors,explode,autupct等屬性

 

回到頂部

五:Pandas

10 Minutes to Pandas

十分鐘搞定pandas(上文翻譯版)

利用python進行資料分析

上面兩個教程用於速成,下面這本書是pandas的作者寫的,用於仔細瞭解

 

  • 一般使用如下語句匯入:import pandas as pd
  • Pandas是基於NumPy 的一種工具,提供了一套名為DataFrame的資料結構,比較契合統計分析中的表結構,可用Numpy或其它方式進行計算
  • 建立Series:pd.Series=(data,index),Series是一維陣列
  • 建立DataFrame:pd.DataFrame(data,index,colums),也可以傳遞一個字典結構來填充data和colums,DataFrame類似於二維表格,簡稱df
  • 檢視df頭尾行:df.head(i),df.tail(i),如不填引數則分別返回除了前五行/倒數前五行的內容
  • 檢視索引/列/資料:df.index,df.colums,df.values
  • 快速統計彙總:df.descrbe()
  • 資料轉置:df.T
  • 按軸排序:df.sort_index(axis=0,ascending=True)
  • 按值排序:df.sort_values(colums,axis=0,ascending=Ture)
  • 獲取:df['columnname']或df.columnname,會返回某列
  • 通過條件選取某列:df = df[df('columns') == 'a']
  • 對行切片:df[start:stop:step],利用df[n:n+1]即可獲取某行
  • 通過標籤選擇某行:df.loc[index,columname]
  • 通過位置選擇某行:df.iloc[indexpos,columnpos],df.iloc[i,:]可獲取一行,df.iloc[:,i]可獲取一列
  • 布林索引:df[bool],可以對單獨的列進行判定,也可以對整個DataFrame進行判定
  • 在pandas中使用np.nan代替缺失值,這些值不會被包含在計算中
  • 對index和columns進行增刪改:df.reindex(index,columns)
  • 去掉含有缺失值的行:df.dropna(how='any'),可以選擇how='all'只去掉所有值均缺失的行
  • 補充缺失值:df.fillna(value)
  • 資料應用:df.apply(func),可以是現有函式也可以是lambda函式
  • 連線:pd.contact(obj),obj可以是Series,DataFrame,Panel
  • 合併:pd.merge(left,right)
  • 追加:df.append(data)
  • 分組:df.groupby(columnname).func(),通常為分組/執行函式/組合結果
  • 時間:pandas有著重取樣等豐富的時間操作
  • 寫入CSV檔案:df.to_csv(filename)
  • 讀取CSV檔案:df.read_csv(filename),結果為DataFrame

回到頂部

六:Scikit-learn

python機器學習實踐與kaggle實戰

Sklearn快速入門

官方文件

官方文件中文翻譯

 

  • sklearn 把所有機器學習的模式整合統一起來了,學會了一個模式就可以通吃其他不同型別的學習模式
  • 步驟一般分為匯入模組-建立資料-建立模型-訓練-預測

特徵工程:

在機器學習中,很重要的一步是對特徵的處理,我們參考下文,先給出一些常用的特徵處理方法在sklearn中的用法

使用sklearn做單機特徵工程

標準化(需要使用距離來度量相似性或用PCA降維時):
from sklearn.preprocessing import StandardScaler
data_train = StandardScaler().fit_transform(data_train)
data_test = StandardScaler().fit_transform(data_test)
區間縮放:
from sklearn.preprocessing import MinMaxScaler
data = MinMaxScaler().fit_transform(data)
歸一化(利於計算梯度下降,消除量綱):
from sklearn.preprocessing import Normalizer
data = Normalizer().fit_transform(data)
定量特徵二值化(大於epsilon為1,小於等於epsilon為0):
from sklearn.preprocessing import Binarizer
data = Binarizer(threshold = epsilon).fit_transform(data)
類別型特徵轉換為數值型特徵:
實際上就是保留數值型特徵,並將不同的類別轉換為啞變數(獨熱編碼),可參考:python中DictVectorizer的使用

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse = False)
X_train = vec.fit_transform(X_train.to_dict(orient = 'recoed'))
卡方檢驗:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#選擇K個最好的特徵,返回選擇特徵後的資料
skb = SelectKBest(chi2, k = 10).fit(X_train, y_train)
X_train = skb.transform(X_train)
X_test = skb.transform(X_test)


互資訊法:
複製程式碼

from sklearn.feature_selection import SelectKBest
from minepy import MINE

#由於MINE的設計不是函式式的,定義mic方法將其為函式式的,返回一個二元組,二元組的第2項設定成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)

#選擇K個最好的特徵,返回特徵選擇後的資料
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
複製程式碼

主成分分析(PCA):
from sklearn.decomposition import PCA
estimator = PCA(n_components=2)#幾個主成分
X_pca = estimator.fit_transform(X_data)


學習演算法:

劃分訓練集和測試集:

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 33)
訓練:

from sklearn import LearnAlgorithm#匯入對應的學習演算法包
la = LearnAlgorithm()
la.fit(X_train, y_train)
y_predict = la.predict(x_test)
隨機梯度下降法(SGD):

from sklearn.linear_model import SGDClassifier
sgd = SGDClassifier()
from sklearn.linear_model import SGDRegressor
sgd = SGDRegressor(loss='squared_loss', penalty=None, random_state=42)
支援向量機(SVM):

支援向量分類(SVC):

from sklearn.svm import SVC
svc_linear = SVC(kernel='linear')#線性核,可以選用不同的核
支援向量迴歸(SVR):

from sklearn.svm import SVR
svr_linear = SVR(kernel='linear')#線性核,可以選用不同的核如poly,rbf
樸素貝葉斯(NaiveBayes):

from sklearn.naive_bayes import MultinomialNB
mnb = MultinomialNB()
決策樹(DecisionTreeClassifier):

from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_leaf=5)#最大深度和最小樣本數,用於防止過擬合
隨機森林(RandomForestClassifier):

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(max_depth=3, min_samples_leaf=5)
梯度提升樹(GBDT):

from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(max_depth=3, min_samples_leaf=5)
極限迴歸森林(ExtraTreesRegressor):

from sklearn.ensemble import ExtraTreesRegressor()
etr = ExtraTreesRegressor()
評估:

from sklearn import metrics
accuracy_rate = metrics.accuracy_score(y_test, y_predict)
metrics.classification_report(y_test, y_predict, target_names = data.target_names)#可以獲取準確率,召回率等資料
K折交叉檢驗:

from sklearn.cross_validation import cross_val_score,KFold
cv = KFold(len(y), K, shuffle=True, random_state = 0)
scores = cross_val_score(clf, X, y, cv = cv)
或

from sklearn.cross_validation import cross_val_score
scores = cross_val_score(dt, X_train, y_train, cv = K)
注意這裡的X,y需要為ndarray型別,如果是DataFrame則需要用df.values和df.values.flatten()轉化

Pipeline機制:

pipeline機制實現了對全部步驟的流式化封裝和管理,應用於引數集在資料集上的重複使用.Pipeline物件接受二元tuple構成的list,第一個元素為自定義名稱,第二個元素為sklearn中的transformer或estimator,即處理特徵和用於學習的方法.以樸素貝葉斯為例,根據處理特徵的不同方法有以下程式碼:

clf_1 = Pipeline([('count_vec', CountVectorizer()), ('mnb', MultinomialNB())])
clf_2 = Pipeline([('hash_vec', HashingVectorizer(non_negative=True)), ('mnb', MultinomialNB())])
clf_3 = Pipeline([('tfidf_vec', TfidfVectorizer()), ('mnb', MultinomialNB())])
特徵選擇:

from sklearn import feature_selection
fs =  feature_selection.SelectPercentile(feature_selection.chi2, percentile=per)
X_train_fs = fs.fit_transform(X_train, y_train)
我們以特徵選擇和5折交叉檢驗為例,實現一個完整的引數選擇過程:

複製程式碼

from sklearn import feature_selection
from sklearn.cross_validation import cross_val_score
percentiles = range(1,100)
results= []
for i in percentiles:
    fs =  feature_selection.SelectPercentile(feature_selection.chi2, percentile=i)
    X_train_fs = fs.fit_transform(X_train, y_train)
    scores = cross_val_score(dt, X_train_fs, y_train, cv = 5)
    results = np.append(results, scores.mean())

opt = np.where(results == results.max())[0]
fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=opt)
X_train_fs = fs.fit_transform(X_train, y_train)
dt.fit(X_train_fs, y_train)
y_predict = dt.predict(x_test)
複製程式碼

超引數:

超引數指機器學習模型裡的框架引數,在競賽和工程中都非常重要

整合學習(Ensemble Learning):

通過對多個模型融合以提升整體效能,如隨機森林,XGBoost,參考下文:

Ensemble Learning-模型融合-Python實現

多執行緒網格搜尋:

用於尋找最優引數,可參考下文:

Sklearn-GridSearchCV網格搜尋

複製程式碼

from sklearn.cross_validation import train_test_split
from sklearn.grid_search import GridSearchCV
X_train, X_test, y_train, y_test = train_test_split(news.data[:3000], news.target[:3000], test_size=0.25, random_state=33)

from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline

clf = Pipeline([('vect', TfidfVectorizer(stop_words='english', analyzer='word')), ('svc', SVC())])

parameters = {'svc__gamma': np.logspace(-2, 1, 4), 'svc__C': np.logspace(-1, 1, 3)}

gs = GridSearchCV(clf, parameters, verbose=2, refit=True, cv=3, n_jobs=-1)

%time _=gs.fit(X_train, y_train)
gs.best_params_, gs.best_score_
print gs.score(X_test, y_test)

七:Kaggle

學習完以上內容後,可以參考下文,已經可以完成一些較為簡單的kaggle contest了

機器學習系列(3)_邏輯迴歸應用之Kaggle泰坦尼克之災

 

認識你是我們的緣分,同學,等等,學習人工智慧,記得關注我。

 

 

微信掃一掃
關注該公眾號

《灣區人工智慧》

回覆《人生苦短,我用Python》便可以獲取下面的超高清電子書和程式碼