1、安裝sklearn
pip3 install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple
2、SVC測試分類法判斷某點所在象限
import numpy as np from sklearn.svm import SVC X = np.array([[1, 1], [-2, 1], [-1, -1], [2, -1]]) y = np.array(['1', '2', '3', '4']) clf = SVC(gamma='auto') clf.fit(X, y) print(clf.predict([[100, 100]]))
這里使用的是SVC分類法,也就是監督學習法。一次性訓練數據,生成模型並使用模型
3、可以增量學習的類
4、sklearn提供的模型
from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC, LinearSVC from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import Perceptron from sklearn.linear_model import SGDClassifier from sklearn.tree import DecisionTreeClassifier
一共分為:分類,回歸,聚類,降維,一般項目主要總到分類和回歸
模型:
分類:SVM、KNN、貝葉斯【多項式、高斯、伯努利】、線性回歸、邏輯回歸、決策樹、隨機森林、xgboost、GBDT、boosting、神經網絡NN
回歸:支持向量機回歸、k臨近回歸器、回歸樹、集成回歸器
聚類:GaussianMixture【GMM】、k-means
降維:
分類器+模型選擇:
MultiOutputClassifier(RandomForestClassifier()) # 隨機森林+多輸出分類器,對特征閾值判斷很有效,可實現判斷不同的閾值
OneVsRestClassifier(SVC) # 一對多分類器+SVC,實測當特征值過多,對閾值判斷會出現錯誤
5、隨機森林RandomForestClassifier,支持多標簽輸出
import numpy as np
import random
from joblib import dump
import os
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn.multioutput import MultiOutputRegressor
from sklearn.linear_model import LinearRegression
from sklearn.multiclass import OneVsRestClassifier
# lr = LinearRegression()
# moedel = MultiOutputRegressor(lr)
model = MultiOutputClassifier(RandomForestClassifier())
# 身高 月收入 顏值
X = [[180, 20000, 90],
[160, 20000, 90],
[180, 3000, 90],
[180, 20000, 40],
[160, 3000, 40]]
Y = [['高', '富', '帥'],
['矮', '富', '帥'],
['高', '窮', '帥'],
['高', '富', '丑'],
['矮', '窮', '丑']]
model.fit(X, Y)
print(model.predict([[180, 20000, 90]]))
# [['高' '富' '帥']]
6、朴素貝葉斯多項式模型MultinomialNB是通過概率來計算結果
如根據一片文章出現"教育"和"科技"的次數來判斷是教育類文章還是科技類文章
7、朴素貝葉斯高斯模型GaussianNB,支持在線學習
import numpy as np X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) Y = np.array([1, 1, 1, 2, 2, 2]) from sklearn.naive_bayes import GaussianNB clf = GaussianNB() clf.fit(X, Y) print(clf.predict([[-0.8, -1]])) clf_pf = GaussianNB() clf_pf.partial_fit(X, Y, np.unique(Y)) print(clf_pf.predict([[-0.8, -1]]))
8、朴素貝葉斯伯努利模型BernoulliNB
9、OneVsRestClassifier+SVC注意事項
標簽不支持多狀態,即某個參數只能有2種狀態;
標簽只能是數字0、1的格式,不能是字符串。
10、分類和回歸的區別
如果希望知道參數的狀態【有限個】則用分類;【如判斷參數是否在閾值之內、判斷一朵花的種類】
如果希望知道參數下一狀態的取值則用回歸。【如預測房價】
圖片轉自:https://blog.csdn.net/zandaoguang/article/details/103047249
11、multiclass與multilabel
這是個概念問題,而不是具體的函數。
multiclass是指一個模型所有特征可能對應多個分類,【如判斷一條新聞是屬於軍事新聞、財經新聞、國際新聞】此時一條新聞只能取一種可能,
然后在已經是multiclass的情況下,如果的某一條特征取值有多個可能性,就是multilabel【如一個既屬於帥哥,又屬於有錢人,又屬於高挑身材的人】
然后不管是multiclass還是multilabel,sklearn都提供兩種分類器來完成分類,OneVsRestClassifier、OneVsOneClassifier【區別就在於建立的分類器個數不同,其他不用深究具體區別】。
那么模型如何知道是multiclass還是multilabel呢?通過fix(x,y)中的y,如果y的格式類似[ [1], [2], [3] ]就是多類,如果是[ [1, 2, 3], [1, 2, 3], [1, 2, 3] ]就是多標簽
12、關於sklearn的預測和診斷
sklearn的診斷是通過分類來實現,即各訓練數據之間沒有關聯,要么屬於0,要么屬於1,然后輸入一條測試數據,輸出一個0或1的label,即診斷這條數據屬於什么類型
sklearn的預測是通過回歸來實現,即各訓練數據之間可能存在某種關聯,在輸入測試數據后,sklearn會結合自己的歷史數據,查找最可能的取值,完成預測。
所謂的診斷和預測其實都是輸出一個在輸入數據那一刻最可能取到的label,而不是真正意義上一段時間后的取值【有大神通過平移使sklear能夠預測未來的值,但原理沒懂:】
13、LinearRegression使用
import numpy as np import random from joblib import dump import os from sklearn.svm import SVC from sklearn.svm import LinearSVC from sklearn.multiclass import OneVsRestClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.multioutput import MultiOutputClassifier from sklearn.multioutput import MultiOutputRegressor from sklearn.linear_model import LinearRegression from sklearn.multiclass import OneVsRestClassifier lr = LinearRegression() model = lr # 身高體重 X = [[180, 20000, 90], [160, 20000, 90], [180, 3000, 90], [180, 20000, 40], [180, 3000, 40], [160, 20000, 40], [160, 3000, 90], [160, 3000, 40]] # 0代表ok,1代表不ok Y = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 0], [1, 1, 1]] print(X, Y) model.fit(X, Y) print(model.predict([[170, 20000, 90]])) # print(model.coef_, model.intercept_) print(model.predict([[160, 3000, 40]])) # print(model.coef_, model.intercept_)
14、GMM的使用
import numpy as np import random import numpy as np from sklearn import mixture # 生成隨機觀測點,含有2個聚集核心 obs = np.concatenate((np.random.randn(100, 1), 10 + np.random.randn(300, 1))) clf = mixture.GaussianMixture(n_components=2) # print(obs) clf.fit(obs) # 預測 print(clf.predict([[0], [2], [9], [10]])) print(clf.score_samples([[0], [2], [9], [10]])) print(clf.predict_proba([[0], [2], [9], [10]]))
15、SGD的使用
from sklearn.linear_model import SGDClassifier X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) Y = np.array([1, 1, 1, 2, 2, 2]) model = SGDClassifier(shuffle=True, loss='log') model.partial_fit(X, Y, classes=np.unique(Y)) print(model.predict([[1, 1]]))
16、如何有效的過濾參數毛刺
1)、采樣
通常傳感器返回的數據頻率較快,通過對這些數據采樣,能夠有效的過濾毛刺