Sklearn庫是基於Python的第三方庫,它包括機器學習開發的各個方面。
機器學習的開發基本分為六個步驟,1)獲取數據,2)數據處理,3)特征工程,4)機器學習的算法訓練(設計模型),5)模型評估,6)應用。
機器學習的算法一般分為兩種:一種既有目標值又有特征值的算法稱之為監督學習,另一種只有特征值的算法稱之為無監督學習。而監督學習還可以繼續細分為分類算法和回歸算法。
1)獲取數據⑤
Sklearn中獲取數據集使用的包為Sklearn.datasets,之后可以接load_* 和fetch_*從Sklearn為初學者提供的數據集中獲取數據。
其中,load獲取的是小規模的數據集,fetch獲取的是大規模的數據集。
from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.datasets import fetch_20newsgroups
news=fetch_20newsgroups
獲取數據可以調用的方法:
.data 特征數據數組
.data.shape 特征值的數量
.target 目標值數組
.DESCR 數據描述
.feature_names 特征值的名字
.target_names 目標值的名字
數據集的返回值:
datasets.base.Bunch(繼承自字典的格式)
dict["key"]= values
bunch.key=values
可以獲取對應的值
2)數據處理
獲取后的數據不是可以直接使用,機器學習的模型獲取需要在訓練集中進行訓練得出模型,而后在測試集中進行測試,所以得到的數據集需要進行划分:
Sklearn中提供可用於對數據集划分訓練集和測試集的方法:
Sklearn.model_selection.train_test_split()
輸入值x為數據集的特征值
輸入值y為數據集的目標值
test_size 測試集的大小,一般為float
random_state 隨機數種子,不用的隨機數種子會產生不同的隨機采樣結果。
返回值的按照順序為:訓練集特征值,測試集特征值,訓練集目標值,測試集目標值
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
3)特征工程
pandas:一個非常方便的讀取數據並進行基本的處理的工具
Sklearn:提供了很強大的特征處理的接口
特征提取:
①字典特征提取:Sklearn.feature_extraction.DictVectorizer
DictVectorizer.fit_transform()
輸入值為字典或者包含字典的迭代器
返回值為sparse矩陣,可以使用False改變返回值的類型為二維數組
DictVectorizer.inverse_transform()
輸入值為數組或者sparse矩陣
返回值為轉換之前的數據格式
DictVectorizer.get_feature_names()
返回值為類別的名稱
應用的場景:1.類別較多,將數據集的特征轉化為字典類型,再利用DictVectorizer進行轉換
2.拿到的是字典類型的數據
②文本特征提取:Sklearn.feature_extraction.text.CountVectorizer(stop_words[])
stop_words:停用詞指的是指定的詞不在做為文本特征提取的處理對象
CountVectorizer.transfer.fit_transform()
輸入值為文本字典或者包含文本字符串的迭代器
返回值為sparse矩陣,sparse矩陣使用toarray方法可以直接轉換為二維數組
CountVectorizer.inverse_transform()
輸入值為數組或者sparse矩陣
返回值為轉換之前的數據格式
CountVectorizer.get_feature_names
返回值為類別的名稱
中文分詞可以使用jieba庫,實現字符串的轉換分詞。
TFIDF文本特征抽取,利用詞在一個文章中使用頻率與別的文章有很大區別,來實現特征的提取。
TFIDF文本特征提取的方法:Sklearn.feature_extraction.text.TfidfVectorizer(stop_words[])
TfidfVectorizer.transfer.fit_transform()
輸入值為文本字典或者包含文本字符串的迭代器
返回值為sparse矩陣,sparse矩陣使用toarray方法可以直接轉換為二維數組
TfidfVectorizer.inverse_transform()
輸入值為數組或者sparse矩陣
返回值為轉換之前的數據格式
TfidfVectorizer.get_feature_names
返回值為類別的名稱
特征預處理:
①歸一化:sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)....)
feature_range=(0,1)數據處理后的范圍
MinMaxScaler.fit_traensform()
輸入值為numpy array格式的數據[n_samples,n_features] [樣本數,特征數]
返回值為形狀相同的array
缺點:這種方式會受到異常值的很大的影響。
②標准化:sklearn.preprocessing.StandardScaler
不用指定范圍會直接將數據處理到(0,1)的范圍內,均值為0,標准差為1
StandardScaler.fit_traensform()
輸入值為numpy array格式的數據[n_samples,n_features] [樣本數,特征數]
返回值為形狀相同的array
標准化的方法比較適合大數據的處理,在樣本足夠多的情況下比較穩定。
特征降維:
指的是降低特征的個數,除去不相關的特征。
Filter過濾式降維方法:
①方差過濾式降維:sklearn.feature_selection.VarianceThreshold(threshold=0.0)
VarianceThreshold.fit_transform()
輸入值為numpy array格式的數據[n_samples,n_features] [樣本數,特征數]
返回值為刪除了低方差特征的特征后的數組
②相關系數過濾式降維:
相關系數的計算方法:scipy.stats.pearsonr(x,y)
輸入值為數據的特征的名稱
③主成分分析(PCA)
sklearn.decomposition.PCA(n_components=None)
將數據進行處理,實現數據的降維。
n_components:
小數:保留百分之多少的信息
整數:減少到剩余多少個信息
PCA.fit_transform()
輸入值為numpy array格式的數據[n_samples,n_features] [樣本數,特征數]
返回值為轉換之后為指定維數的數組
4)機器學習的算法訓練(設計模型)
Sklearn中算法訓練的基本使用:
1.實例化一個estimator類
2.estimator調用fit()方法,對送入的x_train,y_train值進行訓練
3.模型評估:y_predict=estimator.(x_test)
y_predict==y_test
或:accuracy=estimator.score(x_test,y_test)計算出准確率
分類算法:
①KNN算法:
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors為K值,algorithm默認為auto,一般不用設置,會選擇最佳的算法
優點:簡單易於理解,易於實現
缺點:懶惰算法,計算量大,內存的開銷比較大,K值的選擇不一定,需要找到最適合K值才能實現好的結果。
②網格搜索與交叉驗證:
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
返回值為estiamtor對象
estimator:預估器對象
param_grid:預估器參數{"n_neighbors":[1,3,5,7,9]}
cv:進行交叉驗證的折數
可使用的方法:
.fit()輸入訓練數據進行訓練
.score()輸出訓練的准確率
最佳參數:best_param_
最佳結果:best_score_
最佳預估器 :best_estimator_
交叉驗證結果:cv_results_
③朴素貝葉斯算法:認定各個特征之間是相互獨立的。
拉普拉斯平滑系數:分子加上α,分母加上mα(訓練文檔中特征詞出現的個數,α值常為1)
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
優點:分類效率穩定,對缺失數據不太敏感,算法也比較簡單,常用於文本分類
缺點:由於假設了特征之間的相互獨立,如果所用的數據集中的特征之間存在關聯,就會產生不合適的結果
④決策樹:通過將特征進行排序,將影響更大的特征優先進行考慮,可以使用信息增益(信息熵-條件信息熵)作為判定的依據
sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)
criterion:默認為'gini',作為判定的依據,也可以改為'entropy'即為信息增益
max_depth:樹的深度大小(可以通過改變深度大小,減小決策樹的過擬合)
random_state:隨機數種子
決策樹的可視化:
sklearn.tree.export_graphviz(estimator,out_file="tree.dot ",feature_names)
feature_names在輸入之后才能顯示在對應的位置
優點:簡單易理解,可以實現可視化
缺點:沒有設置深度,容易產生過擬合
⑤隨機森林:訓練集隨機:隨機有放回抽樣;特征隨機:從M個特征中,抽取m個特征,M>>m
sklearn.ensemble.RandomForestClassifier(n_estimator=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None,min_sample_lit=2)
max_features="auto":默認為“auto”,每個決策樹的最大特征數量,即為m值得選取方法。
if"auto",求平方根;if"sqrt",求平方根;if"log2",求log2();if None,使用M值
{"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,10,15,30]}
優點:具有很好的准確率,處理高維樣本很有優勢
回歸算法:
①線性回歸:將目標值和特征值當做線性關系,來實現擬合,得到回歸算法。線性模型不等於線性關系,參數一致的非線性關系也可以稱作線性模型。
正規方程:sklearn.linear_model.LinearRegression(fit_intercept=True)
fit_intercept:是否計算偏置
LinearRegression.coef_:回歸系數
LinearRegression.intercept_:偏置
梯度下降:sklearn.linear_model.SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate='invscaling',eta0=0.01)
loss:損失類型,squared_loss最小二乘法的損失函數類型
max_iter:迭代次數
fit_intercept:是否計算偏置
learning_rate:string,optional(指的是步長)
'constant':eta=eta0
''optional":eta=1.0/(alpha*(t+t0))[defult]
'invscaling':eta=eta0/pow(t,power_t) power_t=0.25
SGDRegressor.coef_:回歸系數
SGDRegressor.intercept_:偏置
模型評估方法(均方誤差評估):sklearn.metrics.mean_squared_error(y_true,y_pre)
y_true:真實值
y_pre:預測值
return:浮點數結果
②嶺回歸:進行正則化處理時削弱某些特征值的作用,從而結果過擬合與欠擬合的問題。
L1正則化:直接刪除,L2正則化:削弱作用
sklearn.linear_model.Ridge(alpha=1.0,fit_intercept=True,solver"auto",normolize=False)
alpha:正則化力度,也叫λ取值0~1或者1~10
solver:會根據數據集自動選擇優化方法
normalize:數據是否進標准化,如果設置為True就不用再前面進行標准化,實現效果是一樣的
Ridge.coef_:回歸系數
Ridge.intercept_:偏置
Ridge方法相當於SGDRegressor(penalty='l2',loss="squared_loss"),但是后者缺少可SAG
③邏輯回歸:sklearn.linear_model.LogisticRegression(solver="liblinear",penalty="l2"C=1.0)
solver:優化求解方式
penalty:正則化種類
C:正則化力度
模型評估(精確率和召回率):sklearn.metrics.classification_report(y_true,y_pre,lables[],targer_names=None)
lables:指定類別對應的數字
target_names:目標類別名稱
return:每個類別的精確率和召回率
模型評估(ROC曲線和AUC指標):sklearn.metrics.roc_auc_score(y_true,y_score)
y_true=每個樣本的真實類別,必須為0(反例),1(正例)
y_score=預測得分,可以是正例的估計概率,置信值,分類器方法的返回值
AUC只能用來評估二分類的問題,非常適合評價樣本不均衡中的分類器性能
模型保存和加載:sklearn.externals. joblib
保存模型:joblib.dump(estimator,"my_ridge.pkl")
加載模型:estimator=joblib.load("my_ridge.pkl")
無監督學習:
K-means算法:sklearn.cluster.KMeans(n_clusters=8)
n_clusters:聚類中心的數量
_lables_:默認標記的類型,可以和真實值進行比較
模型評估:高內聚,低耦合(外部距離最大化,內部距離最小化)
sklearn.metrics.silhouette_score(X,labels)輪廓系數
X:特征值
labels:被聚類標記的目標值