這篇文章主要介紹了Python機器學習工具scikit-learn的使用筆記,幫助大家更好的了解和使用python,感興趣的朋友可以了解下
scikit-learn 是基于 Python 語言的機器學習工具
- 簡單高效的資料挖掘和資料分析工具
- 可供大家在各種環境中重複使用
- 建立在 NumPy ,SciPy 和 matplotlib 上
- 開源,可商業使用 - BSD許可證
sklearn 中文文檔:http://www.scikitlearn.com.cn/
官方文檔:http://scikit-learn.org/stable/
sklearn官方文檔的内容和結構如下:
sklearn是基于numpy和scipy的一個機器學習算法庫,設計的非常優雅,它讓我們能夠使用同樣的接口來實作所有不同的算法調用。
sklearn庫的四大機器學習算法:分類,回歸,聚類,降維。其中:
- 常用的回歸:線性、決策樹、SVM、KNN ;內建回歸:随機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
- 常用的分類:線性、決策樹、SVM、KNN,樸素貝葉斯;內建分類:随機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
- 常用聚類:k均值(K-means)、層次聚類(Hierarchical clustering)、DBSCAN
- 常用降維:LinearDiscriminantAnalysis、PCA
還包含了特征提取、資料處理和模型評估三大子產品。
同時sklearn内置了大量資料集,節省了擷取和整理資料集的時間。
使用sklearn進行機器學習的步驟一般分為:導入子產品-建立資料-建立模型-訓練-預測五步。
以下為代碼筆記
有需要文章學習筆記、源碼的小夥伴可如上擷取~
- 一、資料擷取
- *****************
- """
- ##1.1 導入sklearn資料集
- from sklearn import datasets
- iris = datasets.load.iris() #導入資料集
- X = iris.data #獲得其特征向量
- y = iris.target # 獲得樣本label
- ##1.2 建立資料集
- from sklearn.datasets.samples_generator import make_classification
- X, y = make_classification(n_samples=6, n_features=5, n_informative=2,
- n_redundant=2, n_classes=2, n_clusters_per_class=2, scale=1.0,
- random_state=20)
- # n_samples:指定樣本數
- # n_features:指定特征數
- # n_classes:指定幾分類
- # random_state:随機種子,使得随機狀可重
- # 檢視資料集
- for x_,y_ in zip(X,y):
- print(y_,end=': ')
- print(x_)
- """
- 0: [-0.6600737 -0.0558978 0.82286793 1.1003977 -0.93493796]
- 1: [ 0.4113583 0.06249216 -0.90760075 -1.41296696 2.059838 ]
- 1: [ 1.52452016 -0.01867812 0.20900899 1.34422289 -1.61299022]
- 0: [-1.25725859 0.02347952 -0.28764782 -1.32091378 -0.88549315]
- 0: [-3.28323172 0.03899168 -0.43251277 -2.86249859 -1.10457948]
- 1: [ 1.68841011 0.06754955 -1.02805579 -0.83132182 0.93286635]
- """
- """
- *****************
- 二、資料預處理
- *****************
- """
- from sklearn import preprocessing
- ##2.1 資料歸一化
- data = [[0, 0], [0, 0], [1, 1], [1, 1]]
- # 1. 基于mean和std的标準化
- scaler = preprocessing.StandardScaler().fit(train_data)
- scaler.transform(train_data)
- scaler.transform(test_data)
- # 2. 将每個特征值歸一化到一個固定範圍
- scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data)
- scaler.transform(train_data)
- scaler.transform(test_data)
- #feature_range: 定義歸一化範圍,注用()括起來
- #2.2 正則化
- X = [[ 1., -1., 2.],
- [ 2., 0., 0.],
- [ 0., 1., -1.]]
- X_normalized = preprocessing.normalize(X, norm='l2')
- print(X_normalized)
- """
- array([[ 0.40..., -0.40..., 0.81...],
- [ 1. ..., 0. ..., 0. ...],
- [ 0. ..., 0.70..., -0.70...]])
- """
- ## 2.3 One-Hot編碼
- data = [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]
- encoder = preprocessing.OneHotEncoder().fit(data)
- enc.transform(data).toarray()
- """
- *****************
- 三、資料集拆分
- *****************
- """
- # 作用:将資料集劃分為 訓練集和測試集
- # 格式:train_test_split(*arrays, **options)
- from sklearn.mode_selection import train_test_split
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
- """
- 參數
- ---
- arrays:樣本數組,包含特征向量和标簽
- test_size:
- float-獲得多大比重的測試樣本 (預設:0.25)
- int - 獲得多少個測試樣本
- train_size: 同test_size
- random_state:
- int - 随機種子(種子固定,實驗可複現)
- shuffle - 是否在分割之前對資料進行洗牌(預設True)
- 傳回
- ---
- 分割後的清單,長度=2*len(arrays),
- (train-test split)
- """
- """
- *****************
- 四、定義模型
- *****************
- """
- ## 模型常用屬性和工鞥呢
- # 拟合模型
- model.fit(X_train, y_train)
- # 模型預測
- model.predict(X_test)
- # 獲得這個模型的參數
- model.get_params()
- # 為模型進行打分
- model.score(data_X, data_y) # 線性回歸:R square; 分類問題: acc
- ## 4.1 線性回歸
- from sklearn.linear_model import LinearRegression
- # 定義線性回歸模型
- model = LinearRegression(fit_intercept=True, normalize=False,
- copy_X=True, n_jobs=1)
- """
- 參數
- ---
- fit_intercept:是否計算截距。False-模型沒有截距
- normalize: 當fit_intercept設定為False時,該參數将被忽略。 如果為真,則回歸前的回歸系數X将通過減去平均值并除以l2-範數而歸一化。
- n_jobs:指定線程數
- """
- ## 4.2 邏輯回歸
- from sklearn.linear_model import LogisticRegression
- # 定義邏輯回歸模型
- model = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0,
- fit_intercept=True, intercept_scaling=1, class_weight=None,
- random_state=None, solver='liblinear', max_iter=100, multi_class='ovr',
- verbose=0, warm_start=False, n_jobs=1)
- """參數
- ---
- penalty:使用指定正則化項(預設:l2)
- dual: n_samples > n_features取False(預設)
- C:正則化強度的反,值越小正則化強度越大
- n_jobs: 指定線程數
- random_state:随機數生成器
- fit_intercept: 是否需要常量
- """
- ## 4.3 樸素貝葉斯算法NB
- from sklearn import naive_bayes
- model = naive_bayes.GaussianNB() # 高斯貝葉斯
- model = naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- model = naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- """
- 文本分類問題常用MultinomialNB
- 參數
- ---
- alpha:平滑參數
- fit_prior:是否要學習類的先驗機率;false-使用統一的先驗機率
- class_prior: 是否指定類的先驗機率;若指定則不能根據參數調整
- binarize: 二值化的門檻值,若為None,則假設輸入由二進制向量組成
- """
- ## 4.4 決策樹DT
- from sklearn import tree
- model = tree.DecisionTreeClassifier(criterion='gini', max_depth=None,
- min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
- max_features=None, random_state=None, max_leaf_nodes=None,
- min_impurity_decrease=0.0, min_impurity_split=None,
- class_weight=None, presort=False)
- """參數
- ---
- criterion :特征選擇準則gini/entropy
- max_depth:樹的最大深度,None-盡量下分
- min_samples_split:分裂内部節點,所需要的最小樣本樹
- min_samples_leaf:葉子節點所需要的最小樣本數
- max_features: 尋找最優分割點時的最大特征數
- max_leaf_nodes:優先增長到最大葉子節點數
- min_impurity_decrease:如果這種分離導緻雜質的減少大于或等于這個值,則節點将被拆分。
- """
- ## 4.5 支援向量機
- from sklearn.svm import SVC
- model = SVC(C=1.0, kernel='rbf', gamma='auto')
- """參數
- ---
- C:誤差項的懲罰參數C
- gamma: 核相關系數。浮點數,If gamma is ‘auto' then 1/n_features will be used instead.
- """
- ## 4.6 k近鄰算法 KNN
- from sklearn import neighbors
- #定義kNN分類模型
- model = neighbors.KNeighborsClassifier(n_neighbors=5, n_jobs=1) # 分類
- model = neighbors.KNeighborsRegressor(n_neighbors=5, n_jobs=1) # 回歸
- """參數
- ---
- n_neighbors: 使用鄰居的數目
- n_jobs:并行任務數
- """
- ## 4.7 多層感覺機
- from sklearn.neural_network import MLPClassifier
- # 定義多層感覺機分類算法
- model = MLPClassifier(activation='relu', solver='adam', alpha=0.0001)
- """參數
- ---
- hidden_layer_sizes: 元祖
- activation:激活函數
- solver :優化算法{‘lbfgs', ‘sgd', ‘adam'}
- alpha:L2懲罰(正則化項)參數。
- """
- """
- *****************
- 五、模型評估與選擇
- *****************
- """
- ## 5.1 交叉驗證
- from sklearn.model_selection import cross_val_score
- cross_val_score(model, X, y=None, scoring=None, cv=None, n_jobs=1)
- """參數
- ---
- model:拟合資料的模型
- cv : k-fold
- scoring: 打分參數-‘accuracy'、‘f1'、‘precision'、‘recall' 、‘roc_auc'、'neg_log_loss'等等
- """
- ## 5.2 檢驗曲線
- from sklearn.model_selection import validation_curve
- train_score, test_score = validation_curve(model, X, y, param_name, param_range, cv=None, scoring=None, n_jobs=1)
- """參數
- ---
- model:用于fit和predict的對象
- X, y: 訓練集的特征和标簽
- param_name:将被改變的參數的名字
- param_range: 參數的改變範圍
- cv:k-fold
- 傳回值
- ---
- train_score: 訓練集得分(array)
- test_score: 驗證集得分(array)
- """
- """
- *****************
- 六、儲存模型
- *****************
- """
- ## 6.1 儲存為pickle檔案
- import pickle
- # 儲存模型
- with open('model.pickle', 'wb') as f:
- pickle.dump(model, f)
- # 讀取模型
- with open('model.pickle', 'rb') as f:
- model = pickle.load(f)
- model.predict(X_test)
- ## 6.2 sklearn方法自帶joblib
- from sklearn.externals import joblib
- # 儲存模型
- joblib.dump(model, 'model.pickle')
- #載入模型
- model = joblib.load('model.pickle')
以上就是Python機器學習工具scikit-learn的使用筆記的詳細内容,更多關于Python機器學習工具scikit-learn的資料請關注小編其它相關文章!