一般應用分類分析用于提煉應用規(guī)則分類用于提取特征分類用于處理缺失值分類分析算法的選取數據準備
本次分類分析使用股市數據 。此處可參考金融數據準備 。
KNN
K-(KNN) 是一種懶惰學習算法和分類算法 。此外,KNN是機器學習中最簡單的方法 。利用KNN進行分類,預測新點的分類 。
數據預處理
從數據集中選取需要用的數據作為輸入數據和標簽 。
X = dataset.loc[ : , ['high','low','close']].valuesy = dataset.loc[ : , ['Up_Down']].valuesfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
數據標準化
數據標準化對于距離類模型 , 數據歸一化是非常有必要的 。這里使用.中 。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaler.fit(X_train)X_train = scaler.transform(X_train)X_test = scaler.transform(X_test)
模型訓練與預測
from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors=5)knn.fit(X_train, y_train) y_pred = knn.predict(X_test)
模型評價
from sklearn.metrics import classification_report, confusion_matrixprint(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))
[[39 31] [32 44]]precisionrecallf1-scoresupport-10.550.560.557010.590.580.5876accuracy0.57146macro avg0.570.570.57146weighted avg0.570.570.57146
繪制學習曲線
分類以個數為x軸,模型得分為y軸,繪制學習曲線,以模型得分最高的為本次模型最終參數 。
from sklearn.metrics import accuracy_scorescore = []for K in range(40):K_value = https://www.jianzixun.com/K+1knn = KNeighborsClassifier(n_neighbors = K_value, weights='uniform', algorithm='auto')knn.fit(X_train, y_train)y_pred = knn.predict(X_test)score.append(round(accuracy_score(y_test,y_pred)*100,2))plt.figure(figsize=(12, 6))plt.plot(range(1, 41), score, color='red', linestyle='dashed', marker='o',markerfacecolor='blue', markersize=10)plt.title('The Learning curve')plt.xlabel('K Value')plt.ylabel('Score')
帶誤差線的學習曲線
from sklearn import metricsKs = 10mean_acc = np.zeros((Ks-1))std_acc = np.zeros((Ks-1))ConfustionMx = [];for n in range(1,Ks):# 模型訓練和預測neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)yhat=neigh.predict(X_test)mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])# 繪圖plt.figure(figsize=(12,6))plt.plot(range(1,Ks),mean_acc,'g')plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)plt.legend(('Accuracy ', '+/- 3xstd'))plt.ylabel('Accuracy ')plt.xlabel('Number of Nabors (K)')plt.tight_layout()plt.show()# print( "The best accuracy was with",mean_acc.max(), "with k=",mean_acc.argmax()+1)
誤差率可視化
error = []# 計算K值在1-40之間多誤差值for i in range(1, 40):knn = KNeighborsClassifier(n_neighbors=i)knn.fit(X_train, y_train)pred_i = knn.predict(X_test)error.append(np.mean(pred_i != y_test))plt.figure(figsize=(12, 6))plt.plot(range(1, 40), error, color='red', linestyle='dashed', marker='o',markerfacecolor='blue', markersize=10)plt.title('Error Rate K Value')plt.xlabel('K Value')plt.ylabel('Mean Error')
邏輯回歸
邏輯回歸是線性分類起,其本質是由線性回歸通過一定的數學變化而來的 。要理解邏輯回歸 , 得先理解線性回歸 。線性回歸是構造一個預測函數來映射輸入的特性矩陣和標簽的線性關系 。線性回歸使用最佳的擬合直線(也就是回歸線)在因變量()和一個或多個自變量()之間建立一種關系 。在這種技術中,因變量是連續(xù)的,自變量可以是連續(xù)的也可以是離散的,回歸線的性質是線性的 。
類比線性方程 :
可以用矩陣的形式表示該方程,其中 x 與 w 均可以被看作一個列矩陣:
通過函數 ,線性回歸使用輸入的特征矩陣 來輸出一組連續(xù)型的標簽值,以完成各種預測連續(xù)型變量的任務 。若標簽是離散型變量,尤其是滿足0-1分布的離散型變量 , 則可以通過引入聯(lián)系函數(link ),將線性回歸方程 變換為 ,并且令 的值分布在 (0,1) 之間 , 且當 接近0時樣本的標簽為類別0 , 當 接近1時樣本的標簽為類別1,這樣就得到了一個分類模型 。而這個聯(lián)系函數對于邏輯回歸來說,就是函數
線性回歸中 帶入到函數中,即得到二元邏輯回歸模型的一半形式:
其中 為邏輯回歸的返回的標簽值 。假設已經訓練好一組權值向量。只要把我們需要預測的特征矩陣 帶入到 方差中,得到輸出值就是標簽為類別1的概率,于是就能判斷輸入特征矩陣是屬于哪個類別 。
因此邏輯回歸是不直接預測標簽值,而是去預測標簽為類別1的概率 。一般地如果標簽為類別1的概率大于0.5,就認為其為類別1,否在為類別2 。
數據準備
定義x、y,數據標準化、劃分訓練集和測試集 。
dataset['Buy_Sell'] = dataset['Buy_Sell'].astype('int')X = np.asarray(dataset[['open', 'high', 'low', 'close', 'volume']])y = np.asarray(dataset['Buy_Sell'])from sklearn import preprocessingX = preprocessing.StandardScaler().fit(X).transform(X)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
模型實例化
# 模型訓練from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import confusion_matrixLR = LogisticRegression(C=0.01, solver='liblinear').fit(X_train,y_train)yhat = LR.predict(X_test)# predict_proba是所有類的估計值的返回,按類的標簽排序 。# 第1列是第1類P(Y=1|X)的概率,第二列是第0類P(Y=0|X)的概率yhat_prob = LR.predict_proba(X_test)
模型評價
雅卡爾指數( index),又稱為雅卡爾相似系數() , 是用于比較樣本集的相似性與多樣性的統(tǒng)計量 。雅卡爾系數能夠量度有限樣本集合的相似度,其定義為兩個集合交集大小與并集大小之間的比例:
from sklearn.metrics import jaccard_scorejaccard_score(y_test, yhat)
混淆矩陣
from sklearn.metrics import classification_report, confusion_matriximport itertoolsdef plot_confusion_matrix(cm, classes,normalize=False,title='Confusion matrix',cmap=plt.cm.Blues):"""This function prints and plots the confusion matrix.Normalization can be applied by setting `normalize=True`."""if normalize:cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]print("Normalized confusion matrix")else:print('Confusion matrix, without normalization')print(cm)plt.imshow(cm, interpolation='nearest', cmap=cmap)plt.title(title)plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes, rotation=45)plt.yticks(tick_marks, classes)fmt = '.2f' if normalize else 'd'thresh = cm.max() / 2.for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):plt.text(j, i, format(cm[i, j], fmt),horizontalalignment="center",color="white" if cm[i, j] > thresh else "black")plt.tight_layout()plt.ylabel('True label')plt.xlabel('Predicted label')
計算混淆矩陣并繪制非標準化混淆矩陣
cnf_matrix = confusion_matrix(y_test, yhat, labels=[1,0])np.set_printoptions(precision=2)plt.figure(figsize=(12,6))plot_confusion_matrix(cnf_matrix,classes=['Buy_Sell=1','Buy_Sell=0'],normalize= False,title='Confusion matrix')
Confusion matrix, without normalization[[39 53] [38 53]]
分類模型評價報告
print (classification_report(y_test, yhat))
precisionrecallf1-scoresupport00.500.580.549110.510.420.4692accuracy0.50183macro avg0.500.500.50183weighted avg0.500.500.50183
對數損失
對數損失(對數損失)度量預測輸出為0到1之間的概率值的分類器的性能 。
from sklearn.metrics import log_losslog_loss(y_test, yhat_prob)>>> 0.690790520605071LR2 = LogisticRegression(C=0.01, solver='sag').fit(X_train,y_train)yhat_prob2 = LR2.predict_proba(X_test)print ("LogLoss: : %.2f" % log_loss(y_test, yhat_prob2))LogLoss: : 0.69
ROC
(ROC) 曲線顯示了一種檢測或一種檢測組合的每一個可能截止點的敏感性和特異性之間的聯(lián)系/權衡 。此外 , 該曲線是比較兩個工作特征真陽性率(TPR)和假陽性率(FPR) 。曲線下面積(Area Under Curve, AUC)是代表二值分類的ROC曲線下的面積 。
y_pred_proba = LR.predict_proba(X_test)[::,1]fpr, tpr, _ = metrics.roc_curve(y_test,y_pred_proba)auc = metrics.roc_auc_score(y_test, y_pred_proba)plt.figure(figsize=(12,6))plt.plot(fpr,tpr,label="data 1, auc="+str(auc))plt.legend(loc=4)plt.show()
樸素貝葉斯分類器
樸素貝葉斯分類器是一種基于概率統(tǒng)計的分類方法,在條件獨立假設的基礎上使用貝葉斯定理構建算法,能夠通過提供后驗概率估計來量化預測中的不確定性的概率分布模型 。
一些特點貝葉斯定理
貝葉斯定理給出了條件概率 與 之間的關系 。
樸素貝葉斯假設所有屬性 的類條件概率可以被分解為類條件概率的乘積:(給定類別標簽 , 屬性 是相互獨立的)

文章插圖

文章插圖
由于對于每個都是一樣的,所以樸素貝葉斯方程:
在小數據集上仍然可以使用先驗概率作為后驗概率的估計,通過不斷增加更多的屬性在模型中引入解釋變量,可以不斷細化后驗概率 。
求解步驟算法實現
X = dataset[['open', 'high', 'low', 'volume', 'close','Returns']].valuesy = dataset['Buy_Sell'].valuesfrom sklearn.model_selection import StratifiedShuffleSplitfrom sklearn.naive_bayes import GaussianNBfrom sklearn.metrics import confusion_matrixmodel = GaussianNB()sss = StratifiedShuffleSplit(n_splits=5, test_size=0.50, random_state=None)sss.get_n_splits(X, y)cm_sum = np.zeros((2,2))for train_index, test_index in sss.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]model.fit(X_train, y_train)y_pred = model.predict(X_test)cm = confusion_matrix(y_test, y_pred)cm_sum = cm_sum + cmprint('nNaive Bayes Gaussian Algorithms')print('nConfusion Matrix')print('_'*20)print('Predicted')print('pos neg')print('pos: %i %i' % (cm_sum[1,1], cm_sum[0,1]))print('neg: %i %i' % (cm_sum[1,1], cm_sum[0,1]))Naive Bayes Gaussian AlgorithmsConfusion Matrix____________________Predictedpos negpos: 483 467neg: 483 467校準的預測概率
from sklearn.naive_bayes import GaussianNBfrom sklearn.calibration import CalibratedClassifierCVX = dataset.drop(['Buy_Sell'], axis=1).valuesY = dataset['Buy_Sell'].values# 創(chuàng)建高斯樸素貝葉斯實例clf = GaussianNB()# 使用sigmoid校準創(chuàng)建校準交叉驗證clf_sigmoid = CalibratedClassifierCV(clf, cv=2, method='sigmoid')# 校準的概率clf_sigmoid.fit(X, Y)"""CalibratedClassifierCV(base_estimator=GaussianNB(priors=None, var_smoothing=1e-09),cv=2, method='sigmoid')"""# 創(chuàng)建新觀察數據new_observation = [[.4, .4, .4, .4, .4, .4, .4, .4, .4]]clf_sigmoid.predict_proba(new_observation)array([[0.50353248, 0.49646752]])clf_sigmoid.score(X,Y)0.49743589743589745決策樹分類器
決策樹是一種樹狀結構,她的每一個葉子結點對應著一個分類,非葉子結點對應著在某個屬性上的劃分,根據樣本在該屬性上的不同取值降氣劃分成若干個子集 。
基本原理
數模型通過遞歸切割的方法來尋找最佳分類標準,進而最終形成規(guī)則 。分類樹用基尼系數最小化準則,進行特征選擇 , 生成二叉樹 。
決策樹的學習算法包含特征選擇、決策樹的生成、決策樹的剪枝過程 。
特征選擇
選擇對訓練數據具有分類能力的特征,特征選擇的準則是信息增益、或信息增益比 , 特征選擇是決定用哪個特征來劃分特征空間 。
分類決策樹的生成
通過計算信息增益、信息增益比、基尼系數作為特征選擇準則,從根節(jié)點開始 , 遞歸地產生決策樹 。這相當于利用不純度不斷選取局部最優(yōu)特征,或將訓練集分割為能夠基本分類正確的子集 。
CATA分類樹的生成
用基尼系數選擇最優(yōu)特征 , 同時決定該特征的最優(yōu)二值切分點 。計算每個特征對數據集的基尼指數 。對于每個特征 , 對其可能取的每個值,將數據集切分成兩部分,并計算基尼指數 。選擇基尼系數最小的特征以及其切分點作為最優(yōu)特征和最優(yōu)切分點 。不斷循環(huán)直至滿足條件停止 。
決策樹的剪枝
通過極小化決策樹整體的損失函數或代價函數來實現 。用的是正則化極大似然估計進行模型選擇 。損失函數定義為模型擬合程度和模型復雜度求和 ——
剪枝策略:預剪枝、后剪枝
預剪枝
定義:決策樹生成過程中,對每個結點在劃分前先進行估計在模型中引入解釋變量 , 若當前結點的劃分不能帶來決策樹泛化能力的提升 , 則停止劃分并將該結點標記為葉子結點 。
優(yōu)缺點:降低過擬合風險,減少訓練和測試時間開銷 。但”貪心”本質帶來欠擬合風險 。
后剪枝
定義:先從訓練集生產一顆完整的決策樹,自底向上地對非葉子結點進行考察,若該結點對應的子樹替換為葉子結點能夠帶來決策樹泛化能力的提升,則將該子樹替換為葉結點 。
優(yōu)缺點:欠擬合風險小 , 泛化能力優(yōu)于預剪枝 。但訓練時間比未剪枝和預剪枝的時間開銷大得多 。
CATA樹的剪枝
第一步:從生成的決策樹 底部進行剪枝,直到根節(jié)點,形成一個子樹序列。
第二步:利用交叉驗證在驗證集上對子樹序列進行測試 , 選擇最優(yōu)子樹 。
決策樹算法算法描述ID3算法其核心是在決策樹的各級節(jié)點上,使用信息增益方法的選擇標準,來幫助確定生產每個節(jié)點時所對應采用的合適屬性,不能自動分箱,不能剪枝C4.5算法相對于ID3改進是使用信息增益率來選擇節(jié)點屬性 。
克服ID3點不足: ID3只適用于離散的描述屬性,C4.5可以處理連續(xù)和離散屬性;可以剪枝CART算法通過構建樹、修剪樹、評估樹來構建一個二叉樹 。
通過控制樹的結構來控制模型
當終節(jié)點是連續(xù)變量是——回歸樹
當終節(jié)點是分類變量是——分類樹
算法實現
中的決策樹實例
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)from sklearn.tree import DecisionTreeClassifierclassifier = DecisionTreeClassifier()classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)from sklearn.metrics import classification_report, confusion_matrixprint(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))[[686] [10 62]]precisionrecallf1-scoresupportDown0.870.920.8974Up0.910.860.8972accuracy0.89146macro avg0.890.890.89146weighted avg0.890.890.89146模型評價混淆矩陣
import matplotlib.pyplot as pltimport seaborn as snsfrom sklearn import metricscm_matrix = metrics.confusion_matrix(y_test, y_pred)cm_matrixclass_names=[0,1] # nameof classesfig, ax = plt.subplots()tick_marks = np.arange(len(class_names))plt.xticks(tick_marks, class_names)plt.yticks(tick_marks, class_names)# create heatmapsns.heatmap(pd.DataFrame(cm_matrix), annot=True, cmap="YlGnBu" ,fmt='g')ax.xaxis.set_label_position("top")plt.tight_layout()plt.title('Confusion matrix', y=1.1)plt.ylabel('Actual label')plt.xlabel('Predicted label')plt.show()print("Accuracy:",metrics.accuracy_score(y_test, y_pred))Accuracy: 0.8904109589041096決策樹用于特征創(chuàng)造
將每日來盤價、收盤價、交易量等進行環(huán)比,得到每天是增是減的分類型變量 。
# 創(chuàng)造更多的時間dataset['Open_N'] = np.where(dataset['open'].shift(-1) > dataset['open'],'Up','Down')dataset['High_N'] = np.where(dataset['high'].shift(-1) > dataset['high'],'Up','Down')dataset['Low_N'] = np.where(dataset['low'].shift(-1) > dataset['low'],'Up','Down')dataset['Close_N'] = np.where(dataset['close'].shift(-1) > dataset['close'],'Up','Down')dataset['Volume_N'] = np.where(dataset['volume'].shift(-1) > dataset['volume'],'Positive','Negative')dataset.head()數據預處理
X = dataset[['Open', 'Open_N', 'Volume_N']].valuesy = dataset['Up_Down']from sklearn import preprocessingle_Open = preprocessing.LabelEncoder()le_Open.fit(['Up','Down'])X[:,1] = le_Open.transform(X[:,1]) le_Volume = preprocessing.LabelEncoder()le_Volume.fit(['Positive', 'Negative'])X[:,2] = le_Volume.transform(X[:,2]) from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)模型建立與預測
from sklearn.tree import DecisionTreeClassifierclassifier = DecisionTreeClassifier()classifier.fit(X_train, y_train)# 實例化模型Up_Down_Tree = DecisionTreeClassifier(criterion="entropy", max_depth = 4)Up_Down_TreeUp_Down_Tree.fit(X_train,y_train)# 預測predTree = Up_Down_Tree.predict(X_test)print(predTree[0:5])print(y_test[0:5])['Up' 'Up' 'Up' 'Up' 'Down']date2019-12-31Up2019-12-25Up2018-01-11Up2020-08-21Down2019-11-20DownName: Up_Down, dtype: object決策樹可視化
【原理+代碼 基于Python實現五大常用分類算法】
from sklearn.tree import DecisionTreeClassifierfrom IPython.display import Imagefrom sklearn import tree# pip install pydotplusimport pydotplus# 創(chuàng)建決策樹實例clf = DecisionTreeClassifier(random_state=0)X = dataset.['open', 'high', 'low', 'volume', 'Open_Close', 'High_Low','Increase_Decrease', 'Buy_Sell_on_Open', 'Returns']y = dataset['Buy_Sell'] # 訓練模型model = clf.fit(X, y)# 創(chuàng)建 DOT datadot_data = https://www.jianzixun.com/tree.export_graphviz(clf, out_file=None,feature_names=X.columns,class_names=X.columns)# 繪圖graph = pydotplus.graph_from_dot_data(dot_data)# 展現圖形Image(graph.create_png())決策樹可視化2
這里展示了整個決策樹決策過程,這里看似很不清晰 , 但放大后 , 能看清每個小框框的內容:分類規(guī)則、基尼指數、樣本數、類別標簽等等詳細內容 。
支持向量機分類器
支持向量機(, SVM)是一種二分類模型,它的基本模型是定義在特征空間上的間隔最大的線性分類器,間隔最大使它有別于感知機;
SVM的的學習策略就是間隔最大化,可形式化為一個求解凸二次規(guī)劃的問題,也等價于正則化的合頁損失函數的最小化問題 。SVM的的學習算法就是求解凸二次規(guī)劃的最優(yōu)化算法 。
SVM還包括核技巧,這使它成為實質上的非線性分類器 。
中實現SVM也是比較方便 。
from sklearn.svm import SVC # "Support Vector Classifier"from sklearn.metrics import accuracy_scorefrom sklearn.metrics import classification_reportmodel = SVC(kernel = 'rbf', C = 1000,gamma=0.001)model.fit(X_train, y_train)svc_predictions = model.predict(X_test)print("Accuracy of SVM using optimized parameters ", accuracy_score(y_test,svc_predictions)*100)print("Report : ", classification_report(y_test,svc_predictions))print("Score : ",model.score(X_test, y_test))更多分類模型效果評價可參見該文中的評價指標 。
本文到此結束,希望對大家有所幫助 。
- 基于Apache Flink實時計算數據流業(yè)務引擎在京東零售的實踐和落地
- UnitMesh 架構:釋放 AI 編程的全部潛力,程序員將成為代碼質檢員?
- 軟件測試丨只懂黑盒測試也能學會的代碼覆蓋率及精準化測試
- 1分鐘合并100份Word文件居然這么簡單?不用代碼或插件,只需兩步
- 紋眉的技術原理介紹 ?紋眉幾天可以恢復自然
- 熟雞蛋與銀器放在一起擦身為什么銀器會變成黑色藍色紅色的變藍變紅的原理是什么
- windows7電腦藍屏死機故障提示代碼74解決方法
- 牛享精選要下快下, Web惡意程序源代碼合集
- 寫CSS代碼時,先理清偽類和偽元素的用法區(qū)別,能讓代碼精簡不少
- 【知行曉莊】基于“人際交往”主題的小學心理課堂教學策略探析——記第16周棲霞區(qū)小
