Python是應用機器學習發展最快的平臺之一。
在這個迷你課程,你將發現你如何可以開始,建立準確的模型和自信地完成預測建模機器學習項目使用Python在14天。
讓我們開始吧。
誰適合這個迷你課程?
在我們開始之前,讓我們確認一下您是否在正確的位置。
下面的列表提供了一些關於本課程是為誰設計的一般指南。
如果你沒有完全匹配這些點,也不要驚慌,你可能只需要在某個方面溫習一下就可以了。
知道如何寫一點代碼的開發人員。這意味著,一旦您了解了基本語法,學習一門新的程式語言(如Python)並不是什麼大事。這並不意味著您是一個嚮導編碼人員,只是您可以毫不費力地使用基本的類似c的語言。
懂一點機器學習的開發人員。這意味著你知道機器學習的基礎知識,比如交叉驗證、一些算法和偏方差權衡。這並不意味著你是一個機器學習博士,只是你知道地標或者知道去哪裡查找它們。
這個迷你課程既不是關於Python的教科書,也不是關於機器學習的教科書。
它將把您從一個懂得一點機器學習的開發人員變成一個能夠使用Python生態系統(一個正在崛起的專業機器學習平臺)獲得結果的開發人員。
迷你課程概述
這個迷你課程分為14課。
你可以每天完成一節課(推薦),也可以在一天內完成所有課程(硬核!)這取決於你有多少時間和你的熱情程度。
下面是14課,將讓你開始和高效的機器學習在Python:
第1課:下載並安裝Python和SciPy生態系統
第2課:使用Python、NumPy、Matplotlib和panda。
第3課:從CSV加載數據。
第4課:用描述性統計理解數據
第5課:通過可視化理解數據。
第6課:通過預處理數據準備建模。
第7課:重採樣算法評估。
第8課:算法評估指標
第九課:抽查算法
第十課:模型的比較和選擇
第11課:通過算法調優提高準確性
第12課:提高集成預測的準確性。
第13課:最後確定並保存您的模型
第14課:Hello world端到端項目。
每節課可能會花你60秒或最多30分鐘。慢慢來,按照自己的節奏完成課程。問問題,甚至在下面的評論中發布結果。
這些課程期望你去學習如何做事情。我將給您一些提示,但是每節課的部分要點是迫使您了解到到哪裡尋找關於Python平臺的幫助(提示,我在這個博客上直接找到了所有答案,請使用搜索特性)。
我在早期課程中提供了更多的幫助,因為我想讓你們建立一些信心和惰性。
第1課:下載並安裝Python和SciPy
只有訪問了這個平臺,才能開始學習Python中的機器學習。
今天的課程很簡單,您必須下載並安裝Python 3.6平臺到您的計算機上。
訪問Python主頁並下載適用於您的作業系統(Linux、OS X或Windows)的Python。在計算機上安裝Python。您可能需要使用特定於平臺的包管理器,如OS X上的macports或RedHat Linux上的yum。
您還需要安裝SciPy平臺和scikit-learn庫。我建議使用與安裝Python相同的方法。
你可以用Anaconda一次安裝所有的東西(更容易)。推薦給初學者。
通過在命令行中輸入「Python」來首次啟動Python。
檢查所有的版本,你將需要使用以下代碼:
# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
如果有任何錯誤,就必須解它。
第2課:使用Python、NumPy、Matplotlib和panda。
您需要能夠讀寫基本的Python腳本。
作為一名開發人員,您可以很快地學會新的程式語言。Python是區分大小寫的,使用哈希(#)來表示注釋,使用空格來表示代碼塊(空格很重要)。
今天的任務是在Python交互環境中練習Python程式語言的基本語法和重要的SciPy數據結構。
練習賦值,使用Python中的列表和流控制。
練習使用NumPy數組。
練習在Matplotlib中創建簡單的圖形。
練習使用熊貓系列和數據模型。
例如,下面是一個創建panda DataFrame的簡單示例。
import numpy
import pandas
myarray = numpy.array([[1, 2, 3], [4, 5, 6]])
rownames = ['a', 'b']
colnames = ['one', 'two', 'three']
mydataframe = pandas.DataFrame(myarray, index=rownames, columns=colnames)
print(mydataframe)
第3課:從CSV加載數據
機器學習算法需要數據。您可以從CSV文件加載您自己的數據,但當您開始使用Python機器學習時,您應該在標準機器學習數據集上進行練習。
你們今天的任務是熟練地將數據加載到Python中,找到並加載標準的機器學習數據集。
在UCI機器學習知識庫中有許多優秀的CSV格式的標準機器學習數據集,您可以下載並使用它們進行練習。
練習使用標準庫中的css .reader()將CSV文件加載到Python中。
練習使用NumPy和NumPy .loadtxt()函數加載CSV文件。
練習使用panda和Pandas .read_csv()函數加載CSV文件。
首先,下面是一個片段,它將直接從UCI機器學習存儲庫使用panda加載Pima Indians onset of diabetes數據集。
# Load CSV using Pandas from URL
import pandas
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
print(data.shape)
第4課:用描述性統計理解數據
一旦將數據加載到Python中,就需要能夠理解它。
您對數據理解得越好,所構建的模型就越好、越準確。理解數據的第一步是使用描述性統計。
今天的課程是學習如何使用描述性統計來理解你的數據。我建議使用在Pandas DataFrame上提供的幫助函數。
使用head()函數查看前幾行來理解數據。
使用shape屬性檢查數據的尺寸。
使用dtypes屬性查看每個屬性的數據類型。
使用describe()函數檢查數據的分布情況。
使用corr()函數計算變量之間的成對相關性。
下面的示例加載了Pima Indians onset of diabetes數據集,並總結了每個屬性的分布。
# Statistical Summary
import pandas
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
description = data.describe()
print(description)
第5課:通過可視化理解數據
繼續昨天的內容,您必須花時間更好地理解您的數據。
提高對數據理解的第二種方法是使用數據可視化技術(例如繪圖)。
今天,您將學習如何使用Python中的繪圖來單獨理解屬性及其交互。同樣,我建議使用在Pandas DataFrame上提供的幫助函數。
使用hist()函數創建每個屬性的直方圖。
使用plot(kind= ' box ')函數創建每個屬性的盒須圖。
使用pandass .scatter_matrix()函數創建所有屬性的兩兩散點圖。
例如,下面的代碼片段將加載糖尿病數據集並創建數據集的散點圖矩陣。
# Scatter Plot Matrix
import matplotlib.pyplot as plt
import pandas
from pandas.plotting import scatter_matrix
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
scatter_matrix(data)
plt.show()
第6課:通過預處理數據準備建模
您的原始數據可能沒有被設置為用於建模的最佳狀態。
有時,您需要對數據進行預處理,以便將數據中問題的固有結構最好地呈現給建模算法。在今天的課程中,您將使用scikit-learn提供的預處理功能。
scikit-learn庫提供了兩種轉換數據的標準習語。每種轉換在不同的情況下都是有用的:適合和多重轉換以及組合適合和轉換。
有許多技術可以用於為建模準備數據。例如,嘗試下面的一些方法
使用刻度和中心選項標準化數值數據(例如0的平均值和1的標準差)。
使用range選項規範化數值數據(例如範圍為0-1)。
探索更高級的特性工程,比如二進位化。
例如,下面的代碼片段加載Pima Indians onset of diabetes數據集,計算標準化數據所需的參數,然後創建輸入數據的標準化副本。
# Standardize data (0 mean, 1 stdev)
from sklearn.preprocessing import StandardScaler
import pandas
import numpy
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
# separate array into input and output components
X = array[:,0:8]
Y = array[:,8]
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
# summarize transformed data
numpy.set_printoptions(precision=3)
print(rescaledX[0:5,:])
第七課:用重採樣方法求算法值
用來訓練機器學習算法的數據集稱為訓練數據集。用於訓練算法的數據集不能用於為您提供關於新數據的模型準確性的可靠估計。這是一個大問題,因為創建模型的整個想法就是對新數據進行預測。
您可以使用稱為重採樣方法的統計方法來將您的訓練數據集分割成子集,其中一些用於訓練模型,而其他的用於估計不可見數據上的模型的準確性。
你今天這節課的目標是練習使用scikit-learn中提供的不同的重採樣方法,例如:
將數據集分成訓練集和測試集。
估計一個算法的準確性使用k-fold交叉驗證。
估計一個算法的準確性使用撇一交叉驗證。
下面的代碼片段使用scikit-learn對皮馬印第安人糖尿病發病數據集使用10倍交叉驗證估計Logistic回歸算法的準確性。
# Evaluate using Cross Validation
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression(solver='liblinear')
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))
第8課:算法評估指標
有許多不同的度量標準可以用來評估機器學習算法在數據集上的技能。
您可以通過cross_valid. cross_val_score()函數在scikit-learn中指定用於測試工具的度量,默認值可以用於處理回歸和分類問題。您今天課程的目標是練習使用scikit-learn包中提供的不同算法性能指標。
練習在分類問題上使用準確性和LogLoss度量。
練習製作混淆矩陣和分類報告。
在回歸問題上練習使用RMSE和RSquared度量。
下面的代碼片段演示了如何計算皮馬印第安人糖尿病發病數據集上的LogLoss度量。
# Cross Validation Classification LogLoss
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression(solver='liblinear')
scoring = 'neg_log_loss'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("Logloss: %.3f (%.3f)") % (results.mean(), results.std())
第九課:抽查算法
您不可能預先知道哪種算法對您的數據執行得最好。
你必須通過試錯來發現它。我稱其為抽查算法。scikit-learn圖書館為許多機器學習算法和工具提供了一個接口,以比較這些算法的估計精度。
在這節課中,你必須練習抽查不同的機器學習算法。
對數據集的線性算法進行抽查(例如線性回歸、邏輯回歸和線性判別分析)。
抽查數據集上的一些非線性算法(如KNN、SVM和CART)。
在數據集上對一些複雜的集成算法進行抽樣檢查(例如隨機森林和隨機梯度提升)。
例如,下面的代碼片段對波士頓房價數據集上的k近鄰算法進行抽樣檢查。
# KNN Regression
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsRegressor
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
kfold = KFold(n_splits=10, random_state=7)
model = KNeighborsRegressor()
scoring = 'neg_mean_squared_error'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print(results.mean())
第十課:模型的比較和選擇
現在您已經知道了如何在數據集中抽查機器學習算法,您需要知道如何比較不同算法的估計性能並選擇最佳模型。
在今天的課程中,你將練習比較Python中機器學習算法和scikit-learn的精確性。
比較數據集上的線性算法。
在數據集中比較不同的非線性算法。
比較同一算法的不同配置。
創建比較算法的結果圖。
下面的例子比較了邏輯回歸和線性判別分析彼此對皮馬印第安人糖尿病發病數據集。
# Compare Algorithms
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# prepare models
models = []
models.append(('LR', LogisticRegression(solver='liblinear')))
models.append(('LDA', LinearDiscriminantAnalysis()))
# evaluate each model in turn
results = []
names = []
scoring = 'accuracy'
for name, model in models:
kfold = KFold(n_splits=10, random_state=7)
cv_results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
print(msg)
第11課:通過算法調優提高準確性
一旦您發現了一兩個在數據集上表現良好的算法,您可能想要改進那些模型的性能。
提高算法性能的一種方法是針對特定數據集調整其參數。
scikit-learn庫提供了兩種方法來搜索機器學習算法的參數組合。你今天的目標是練習每一個。
使用指定的網格搜索調優算法的參數。
使用隨機搜索調優算法的參數。
下面的代碼片段是使用網格搜索在糖尿病皮馬印第安人發病數據集上使用Ridge回歸算法的示例。
# Grid Search for Algorithm Tuning
from pandas import read_csv
import numpy
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
alphas = numpy.array([1,0.1,0.01,0.001,0.0001,0])
param_grid = dict(alpha=alphas)
model = Ridge()
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3)
grid.fit(X, Y)
print(grid.best_score_)
print(grid.best_estimator_.alpha)
第12課:提高集成預測的準確性
提高模型性能的另一種方法是結合來自多個模型的預測。
一些模型提供了內置的這種能力,如用於bagging的隨機森林和用於boosting的隨機梯度增強。另一種稱為投票的集合可以用來將來自多個不同模型的預測組合在一起。
在今天的課程中,你將練習使用合奏法。
使用隨機森林和額外樹算法練習包集成。
用梯度增強機和AdaBoost算法練習增強集合。
通過結合來自多個模型的預測來練習投票組合。
下面的代碼片段演示了如何在糖尿病數據集Pima Indians onset上使用隨機森林算法(一個袋裝的決策樹集合)。
# Random Forest Classification
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
num_trees = 100
max_features = 3
kfold = KFold(n_splits=10, random_state=7)
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
第13課:最後確定並保存您的模型
一旦你在機器學習問題上找到了一個性能良好的模型,你就需要完成它。
在今天的課程中,你將練習與最終確定你的模型相關的任務。
練習用你的模型對新數據(在訓練和測試中看不到的數據)做出預測。
練習保存訓練過的模型,將它們歸檔並再次加載。
例如,下面的代碼片段展示了如何創建邏輯回歸模型,將其保存到文件中,然後稍後加載它,並對未見數據進行預測。
# Save Model Using Pickle
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pickle
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# Fit the model on 67%
model = LogisticRegression(solver='liblinear')
model.fit(X_train, Y_train)
# save the model to disk
filename = 'finalized_model.sav'
pickle.dump(model, open(filename, 'wb'))
# some time later...
# load the model from disk
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_test, Y_test)
print(result)
第十四課:Hello world端到端項目
您現在知道了如何完成一個預測建模機器學習問題的每個任務。
在今天的課程中,你需要練習將這些片段組合在一起,並通過端到端標準的機器學習數據集進行工作。
通過虹膜數據集端到端的工作(機器學習的hello world)
這包括以下步驟:
使用描述性統計和可視化來理解數據。
對數據進行預處理,以最好地暴露問題的結構。
使用您自己的測試工具對許多算法進行抽樣檢查。
使用算法參數調整改進結果。
使用集成方法改進結果。
完成模型以備將來使用。
慢慢來,一路記錄你的結果。