機器學習實戰筆記

一.端到端的機器學習項目
數據預處理常做的操作:
–數據映射—>data[col_name == 原值 ,col_name]=映射值
–獲取列名列表—>col_names = data.columns.tolist()
–預覽數據情況—>data.head() 默認訪問前5行
–去掉一些無關列—>todrop=[’’,’’] data.drop(todrop,axis=1)
–同等重要的兩列特徵差值較大—>標準化

1.快速查看數據結構
head() 查看前5行
info() 可以快速獲取數據集的簡單描述
value_counts() 查看多少種分類存在,每種分類可以顯示數值屬性的摘要
describe() 顯示數值屬性的摘要

整個數據集上調用hist()方法,繪製每個屬性的直方圖
例:import matplotlib.pyplot as plt
housing.hist(bins=50,figsize(20,15))
plt.show()

創建測試集:
(純隨機抽樣方法)

from sklearn.model_selection import train_test_split
predictors = ["col1", "col2"]
x_train, x_test, y_train, y_test = train_test_split(data[predictors], data["target"], test_size=0.4, random_state=0)

(分層抽樣)
col列爲分層基於的列

from sklearn.model_selection import StratifiedShuffleSplit
split = StratiffiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index,test_index in split.split(data,data["col"]):
    start_train_set = data.loc[train_index]
    start_test_set = data.loc[test_index]

數據探索和可視化

地理數據可視化:

housing.plot(kind="scatter", x="longtitude", y="latitude", alpha=xxx
                    s=housing["population"]/100,label="population"
                    c="median_house_value",cmap=plt.get_cmap("jet"),colorbar=True)

尋找相關性:
(col列與其他列的相關性)
corr_matrix = data.corr()
corr_matrix[“col”].sort_values(ascendsing=False)
皮爾遜相關係數: 越接近1,表示有越強的正相關, 越接近-1,表示有越強的負相關

繪製每個數值屬性相對於其他數值屬性的相關性。

from pandas.tools.plotting import scatter_matrix
attributes = ["col1","col2","col3","col4"]
scatter_matrix(housing[attribute],figsize=(12,8))

實驗不同屬性的組合
例:housing[“rooms_per_household”] = housing[“total_rooms”]/housing[“households”]

數據準備:
data = train_set.drop(“col”, axis=1)
label = train_set[“col”].copy
drop()會創建一個數據副本,但不影響data

數據清理:
col列屬性有部分值缺失,解決辦法:
-放棄相應值:data.dropna(=[“col”])
-放棄這個屬性:data.drop(“col”,axis=1)
-將缺失的值設置爲某個值:data[“col”].fillna(median)

處理缺失值:
from sklearn.preprocessing import Imputer
imputer = Imputer(strategy=“median”)
使用fit()方法將imputer實例適配到訓練集:
imputer.fit(housing_num)
這裏imputer只計算了每個屬性的中位數值,並將結果存儲在其實例變量statistics_
X=imputer.transform(housing_num)

skikit-learn爲這類任務提供了一個轉換器 LabelEncoder:

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
housing_cat = housing["ocean_proximity"]
housing_cat_encoded = encoder.fit_transform(housing_cat)
housing_cat_encoded

由此產生的問題:機器學習算法會以爲兩個相近的數字比兩個離得較遠的數字更爲近似一些
爲解決這個問題,常見的解決方案是給每個類別創建一個二進制的屬性,獨熱編碼
Scikit-learn提供了一個OneHotEncoder編碼器,可以將整數分類值轉換爲獨熱向量
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))

這裏輸出的是一個Scipy稀疏矩陣

使用LabelBinarizer類可以一次性完成兩個轉換(從文本類別轉化爲整數類別,再從整數類別轉換爲獨熱向量)
from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
housing_cat_1hot = encoder.fit_transform(housing_cat)
通過發送sparse_output=True給LabelBinarizer構造函數,可以得到稀疏矩陣

使用交叉驗證來更好地進行評估
from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg,housing_prepared,housing_labels,scoring=“neg_mean_squared_error”,cv=10)
rmse_scores = np.sqrt(-scores)

隨機森林

from sklearn.ensemble import RandomForestRegressor
forest_reg = RandomForestRegressor()
forest_reg.fit(housing_prepared,housing_labels)

微調模型
網格搜索
可以用scikit-learn的GridSearchCV來進行探索

from sklearn.model_selection import GridSearchCV
param_grid = [
   {'n_estimators':[3,10,30],'max_features':[2,4,6,8]},
   {'bootstrap':[False],'n_estimators':[3,10],'max_features':[2,3,4]},
    ]
  forest_reg = RandomForestRegressor()
  grid_search = GridSearchCV(forest_reg, param_grid, cv=5, scoring='neg_mean_squared_error')
  grid_search.fit(housing_prepared,housing_labels)

param_grid 告訴scikit-learn 首先評估第一個dict中n_estimator和max_features的所有34=12種超參數組合
接着 嘗試第二個dict中超參數值所有的2
3=6種組合,但這次超參數bootstrap需要設置爲False而不是True
最佳參數組合:grid_search.best_params_

隨機搜索
當超參數的搜索範圍較大時,通常會優先選擇RandomizedSearchCV
如果運行隨機搜索1000個迭代,將會探索每個超參數的1000個不同的值。

分析最佳模型及其錯誤
randomforestregressor可以指出每個屬性的相對重要程度
feature_importances = grid_search.best_estimator_.feature_importances_
將這些重要性分數顯示在對應屬性名稱旁邊:
sorted( zip(feature_importances,attributes),reverse=True )

通過測試集評估系統

final_model = grid_search.best_estimator_

x_test = start_test_set.drop("median_house_value",axis=1)
y_test = start_test_set["median_house_value"].copy()
x_test_prepared = full_pipeline.transform(x_test)
final_predictions = final_model.predict(x_test_prepared)

final_mse = mean_squared_error(y_test,final_predictions)
final_rmse = np.sqrt(final_mse)

二.分類
x,y = minst[“data”],minst[“target”]
x.shape
y.shape

顯示圖片

import matplotlib
import matplotlib.pyplot as plt
some_digit = X[36000]
some_digit_image = some_digit.reshape(28,28)
plt.imshow(some_digit_image, cmap = matplotlib.cm.binary,interpolation="nearest")
plt.axis("off")
plt.show()

訓練集數據洗牌

x_train,x_test,y_train,y_test = X[:60000],X[60000:],Y[:60000],Y[60000:]
import numpy as np
shuffle_index = np.random.permutation(60000)
x_train,y_train =x_train[shuffle_index],y_train[shuffle_index]

訓練一個二元分類器
先爲此分類任務創建目標向量:
y_train_5 = (y_train == 5)
y_test_5 = (y_test == 5)

訓練:
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42)
sgd_clf.fit(x_train,y_train_5)

sgd_clf.predict([some_digit])

實施交叉驗證:
from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

skfolds = StratifiedKFold(n_split=3, random_state=42)

for train_index,test_index in skfolds.split(x_train,y_train_5):
clone_clf = clone(sgd_clf)
x_train_folds = x_train[train_index]
y_train_folds = (y_train_5[train_index])
x_test_fold = x_train[test_index]
y_test_fold = (y_train_5[test_index])

clone_clf.fit(x_train_folds,y_train_folds)
y_pred = clone_clf.predict(x_test_fold)
n_correct = sum(y_pred == y_test_fold)
print(n_correct / len(y_pred)

每個摺疊由StratifiedKFold執行分層抽樣產生,其所包含的各個類的比例符號整體比例。

混淆矩陣
評估分類器性能的更好方法是混淆矩陣
from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf,x_train,y_train_5,cv=3)
與cross_val_score()函數一樣,cross_val_predict()函數同樣執行K-fold交叉驗證,但返回的不是評估分數,而是每個
摺疊的預測。

from sklearn.metrics import confusion_matrix #使用此函數獲取混淆矩陣
confusion_matrix(目標類別,預測類別)
混淆矩陣中的行表示實際類別,列表示預測類別。
一個完美的分類器只有真正類和真負類,所以它的混淆矩陣只會在其對角線上有非零值

精度:TP/(TP+FP) 預測出來的有多少是準確的
召回率=TP/(TP+FN)
scikit-learn提供了計算多種分類器指標的函數,精度和召回率也是其一
from sklearn.metrics import precision_score,recall_score
precison_score(y_train,y_pred)
recall_score(y_train,y_train_pred)

將精度和召回率組合成一個單一的指標,稱爲F1分數,F1是精度和召回率的諧波平均值
要計算F1分數,只需要調用f1_score()
from sklearn.metrics import f1_score
某些情況下,更關心精度,另一些情況下,更關心召回率

多標籤分類
爲每個實例產出多個類別,比如:既是大數,又是奇數

from sklearn.neighbors import KNeightborsClassifier
y_train_large = (y_train >= 7)
y_train_odd = (y_train %2 ==1)
y_multilabel = np.c_[y_train_large,y_train_odd]
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train,y_multilabel)

多輸出分類
使用Numpy的randint()函數爲MNIST圖片的像素強度增加噪聲。目標是將圖片還原爲原始圖片:

noise = rnd.randint( 0,100,(len(x_train),784) )
noise = rnd.randint( 0,100,(len(x_test),784) )
x_train_mod = x_train + noise
x_test_mod = x_test +noise
knn_clf.fit(x_train_mod, y_train_mod)
clean_digit = knn_clf.predict( [x_test_mod[some_index]] )
plot_digit(clean_dight)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章