日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2、创建分类器笔记

發布時間:2023/12/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2、创建分类器笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建分類器

簡介:分類是指利用數據的特性將其分類成若干類型的過程。分類與回歸不同,回歸的輸出是實數。監督學習分類器就是用帶標記的訓練數
據建立一個模型,然后對未知的數據進行分類。
分類器可以實現分類功能的任意算法,最簡單的分類器就是簡單的數學函數。其中有二元(binary)分類器,將數據分成兩類,也可多元(multiclass)分類器,將數據分成兩個以上的類型。解決分類問題的數據手段都傾向于解決二元分類問題,可通過不同形式對其進行擴展,進而解決多元分類。

1、建立簡單分類器

import numpy as np import matplotlib.pyplot as plt# 準備數據 X = np.array([[3,1], [2,5], [1,8], [6,4], [5,2], [3,5], [4,7], [4,-1]]) y = [0, 1, 1, 0, 0, 1, 1, 0] # 根據y的值分類X,取值范圍為0~N-1,N表示有N個類 class_0=np.array([X[i] for i in range(len(X)) if y[i]==0]) class_1=np.array([X[i] for i in range(len(X)) if y[i]==1]) # 將點畫出 plt.figure() plt.scatter(class_0[:,0],class_0[:,1],color='red',marker='s') plt.scatter(class_1[:,0],class_1[:,1],color='black',marker='x') # 創建y=x的直線 line_x=range(10) line_y=line_x plt.plot(line_x,line_y,color='blue',linewidth=3) plt.show()

2、邏輯回歸分類器

邏輯回歸是一種分類方法,給定一組數據點,需要建立一個可以在類之間繪制線性邊界的模型。就可以對訓練數據派生的一組方程進行求解來提取邊界。

import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt# 準備數據 X = np.array([[4, 7], [3.5, 8], [3.1, 6.2], [0.5, 1], [1, 2], [1.2, 1.9], [6, 2], [5.7, 1.5], [5.4, 2.2]]) y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])# 初始化一個邏輯分類回歸器 classifier=linear_model.LogisticRegression(solver='liblinear',C=10000)#solver設置求解系統方程的算法類型,C表示正則化強度,越小表強度越高,C越大,各個類型的邊界更優。#訓練分類器 classifier.fit(X,y)# 定義畫圖函數 def plot_classifier(classifier,X,y):# 獲取x,y的最大最小值,并設置余值x_min,x_max=min(X[:,0])-1.0,max(X[:,0]+1.0)y_min,y_max=min(X[:,1])-1.0,max(X[:,1]+1.0)# 設置網格步長step_size=0.01# 設置網格x_values,y_values=np.meshgrid(np.arange(x_min,x_max,step_size),np.arange(y_min,y_max,step_size))# 計算出分類器的分類結果mesh_output=classifier.predict(np.c_[x_values.ravel(),y_values.ravel()])mesh_output=mesh_output.reshape(x_values.shape)# 畫圖plt.figure()#選擇配色方案plt.pcolormesh(x_values,y_values,mesh_output,cmap=plt.cm.gray)# 畫點plt.scatter(X[:,0],X[:,1],c=y,s=80,edgecolors='black',linewidths=1,cmap=plt.cm.Paired)# 設置圖片取值范圍plt.xlim(x_values.min(),x_values.max())plt.ylim(y_values.min(),y_values.max())# 設置x與y軸plt.xticks((np.arange(int(min(X[:, 0]) - 1), int(max(X[:, 0]) + 1), 1.0)))plt.yticks((np.arange(int(min(X[:, 1]) - 1), int(max(X[:, 1]) + 1), 1.0)))plt.show()# 畫出數據點和邊界 plot_classifier(classifier,X,y)

3、樸素貝葉斯分類去

用貝葉斯定理進行建模的監督學習分類器。
下面舉個例子,雖然這個例子沒有區分訓練集和測試集,一般情況最好還是區分一下。

from sklearn.naive_bayes import GaussianNB# 準備數據 input_file = 'data_multivar.txt' X = [] y = [] with open(input_file, 'r') as f:for line in f.readlines():data = [float(x) for x in line.split(',')]X.append(data[:-1])y.append(data[-1])X = np.array(X) y = np.array(y) # 建立樸素貝葉斯分類器 classifier_gaussiannb=GaussianNB() classifier_gaussiannb.fit(X,y) y_pre=classifier_gaussiannb.predict(X) # 計算分類器的準確性 accuracy=100.0*(y==y_pre).sum()/X.shape[0] print('結果:',accuracy) # 畫出數據和邊界 plot_classifier(classifier_gaussiannb,X,y)

4、將數據集分割成訓練集和數據集

分割訓練集和測試集,更好的評估模型

from sklearn.naive_bayes import GaussianNB from sklearn import cross_validation# 準備數據 input_file = 'data_multivar.txt' X = [] y = [] with open(input_file, 'r') as f:for line in f.readlines():data = [float(x) for x in line.split(',')]X.append(data[:-1])y.append(data[-1])X = np.array(X) y = np.array(y) x_train,x_test,y_train,y_test=cross_validation.train_test_split(X,y,test_size=0.25,random_state=5)# 測試數據占25%, # 建立樸素貝葉斯分類器 classifier_gaussiannb=GaussianNB() classifier_gaussiannb.fit(x_train,y_train) y_test_pre=classifier_gaussiannb.predict(x_test) # 計算分類器的準確性 accuracy=100.0*(y_test==y_test_pre).sum()/x_test.shape[0] print('結果:',accuracy) # 畫出數據和邊界 plot_classifier(classifier_gaussiannb,x_test,y_test_pre)

5、用交叉驗證檢驗模型準確性

為了能讓模型更加穩定,還需要用數據的不同子集進行反復驗證,若只是對特定的子集進行微調,會造成過度擬合。

5.1 性能指標

概念:

  • 精度(precision):被正確分類的樣本數量占分類器分類出的總分類樣本數量的百分比。
  • 召回率(recall):被正確分類的樣本數量占某分類總樣本數量的百分比。

    良好的機器學習模型需要保持兩個指標能夠同事處于合理高度,所以引入F1得分指標,是精度和召回率的合成指標,實際上是精度和召回率的調和均值(harmonic mean),公式如下:
    F1得分=2精度召回率/(精度+召回率)
    代碼實現交叉驗證:

    num_validations = 5# 正確率accuracy = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='accuracy', cv=num_validations)print("Accuracy: " + str(round(100*accuracy.mean(), 2)) + "%")# F1f1 = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='f1_weighted', cv=num_validations)print("F1: " + str(round(100*f1.mean(), 2)) + "%")# 精度precision = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='precision_weighted', cv=num_validations)print("Precision: " + str(round(100*precision.mean(), 2)) + "%")# 召回率recall = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='recall_weighted', cv=num_validations)print("Recall: " + str(round(100*recall.mean(), 2)) + "%")# 畫出數據和邊界plot_classifier(classifier_gaussiannb,x_test,y_test_pre)

6、混淆矩陣可視化

混淆矩陣(confusion matrix)是理解分類模型性能的數據表,它有助于我們理解如何把測試數據分成不同的類。當向對算法進行調優時,就需要在
對算法做出改變之前了解數據的錯誤分類情況。有些分類效果比其他分類效果差,混淆矩陣可以幫我們理解。

from sklearn.metrics import confusion_matrix# 顯示混淆矩陣 def plot_confusion_matrix(confusion_mat):plt.imshow(confusion_mat,interpolation='nearest',cmap=plt.cm.gray)plt.colorbar()tick_marks=np.arange(4)plt.xticks(tick_marks,tick_marks)plt.yticks(tick_marks,tick_marks)plt.show()y_true = [1, 0, 0, 2, 1, 0, 3, 3, 3] y_pred = [1, 1, 0, 2, 1, 0, 1, 3, 3] confusion_mat=confusion_matrix(y_true,y_pred) plot_confusion_matrix(confusion_mat)

7、提取性能報告

可直接使用上面的scikit-learn打印精度、召回率和F1得分。但是如果不需要單獨計算各個指標,可用該函數直接從模型中提取所有統計值。

# 提取性能報告 from sklearn.metrics import classification_reporttarget_names = ['Class-0', 'Class-1', 'Class-2', 'Class-3'] print(classification_report(y_true,y_pred,target_names=target_names))

8、根據汽車特征評估質量

使用隨機森林分類器,用一個包含汽車多種細節的數據集,分類吧汽車的質量分成4中:不達標、達標、良好、優秀。代碼如下:

from sklearn import preprocessing from sklearn.ensemble import RandomForestClassifier# 準備數據 input_file = 'car.data.txt'X = [] count = 0 with open(input_file, 'r') as f:for line in f.readlines():data = line[:-1].split(',') # line[:-1]表示line中最后一個換行刪除X.append(data)X = np.array(X)# 使用標記編將字符串轉化為數值 label_encoder = [] X_encoder = np.empty(X.shape) print(X[0]) for i, item in enumerate(X[0]): # 由于相同的信息是以列的形式顯示,所以應該按列進行標記編碼label_encoder.append(preprocessing.LabelEncoder()) # 初始化每列的標記編碼器X_encoder[:, i] = label_encoder[-1].fit_transform(X[:, i]) # 未標記編碼X = X_encoder[:, :-1].astype(int) # 將所有數據的除最后一列作為X,最后一列作為y y = X_encoder[:, -1].astype(int)# 訓練隨機森林分類器 params = {'n_estimators': 200, 'max_depth': 8, 'random_state': 7} # 跟上章監督學習中的隨機森林回歸的參數一個意思: # n_estimators指評估器的數量,則決策樹數量,min_samples_split指決策樹分裂一個節點需要用到的最小數據樣本量 classifier = RandomForestClassifier(**params) classifier.fit(X, y)# 進行交叉驗證 from sklearn import model_selection# model_selection 將之前的sklearn.cross_validation, sklearn.grid_search 和 sklearn.learning_curve模塊組合到一起accuracy = model_selection.cross_val_score(classifier, X, y, scoring='accuracy', cv=3) print('accuracy:', str(round(accuracy.mean(), 2)) + '%')# 對某條信息進行分類 input_data = ['low', 'low', '4', 'more', 'big', 'med'] input_data_encoded = [-1] * len(input_data)for i, item in enumerate(input_data):labels=[]labels.append(input_data[i])# 轉換形式,否則下行會報錯input_data_encoded[i] = int(label_encoder[i].transform(labels))input_data_encoder = np.array(input_data_encoded) output_class = classifier.predict(input_data_encoder) # 預測 print('結果:', label_encoder[-1].inverse_transform(output_class)[0]) # 最后一個編碼器是結果

9、生成驗證曲線

在第8節中使用了n_estimators和max_depth參數,而這兩個被稱為超參數(hyperparameters),分類器的性能取決于這兩個參數的值,而這節就是使用驗證曲線理解訓練得分情況。(其他參數可不變),實例如下:

from sklearn.model_selection import validation_curveclassifier=RandomForestClassifier(max_depth=4,random_state=7) parameter_grid=np.linspace(25,200,8).astype(int) train_scores,validation_scores=validation_curve(classifier,X,y,'n_estimators',parameter_grid,cv=5)#對n_estimators參數進行驗證 print('training scores:',train_scores) print('validation scores:',validation_scores)plt.figure() plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black') plt.show()classifier=RandomForestClassifier(n_estimators=20,random_state=7) parameter_grid=np.linspace(2,10,5).astype(int) train_scores,validation_scores=validation_curve(classifier,X,y,'max_depth',parameter_grid,cv=5)#max_depth print('training scores:',train_scores) print('validation scores:',validation_scores)plt.figure() plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black') plt.show()

10、生成學習曲線

學習曲線可幫助我們理解訓練數據集大小對機器學習模型的影響,當遇到計算能力限制時,這點十分有用,實例如下:

from sklearn.model_selection import learning_curveclassifier=RandomForestClassifier(random_state=7) parameter_grid=np.array([200,500,800,1100]) train_size,train_scores,validation_scores=learning_curve(classifier,X,y,train_sizes=parameter_grid,cv=5)#cv表示五折交叉驗證 print('train_scores:',train_scores) print('validation_scores:',validation_scores)plt.figure() plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black') plt.show()

ps:雖然訓練數據集的規模越小,仿佛精確度越高,但是它很容易造成過擬合問題。但是若選擇較大的數據集,又會消耗更多資源,所以應綜合考慮。

11、估算收入階層

這里使用樸素貝葉斯分類器。這里的方法和第8節的一樣,只是多了數字和字符串的混合編碼,所以一些代碼注釋可查看上方第8節。

# 1、讀取數據 input_file='adult.data.txt' X=[]countLess=0 countMore=0 countAll=20000with open(input_file,'r') as f:for line in f.readlines():if '?' not in line:data=line[:-1].split(', ')# 2、若大部分點都屬于同一個類型,則分類器會傾向于該類型,所以應該選出大于50k與小于等于50k各10000if data[-1]=='<=50K' and countLess<countAll:X.append(data)countLess=countLess+1elif data[-1]=='>50K' and countMore<countAll:X.append(data)countMore=countMore+1if countMore>=countAll and countLess>=countAll:break;X=np.array(X) from sklearn import preprocessing # 3、對數據進行編碼 label_encoder=[] for i,item in enumerate(X[0]):if item.isdigit():X[:,i]=X[:,i]else:label_encoder.append(preprocessing.LabelEncoder())X[:,i]=label_encoder[-1].fit_transform(X[:,i])y=X[:,-1].astype(int) X=X[:,:-1].astype(int) # 4、將數據分成訓練和測試from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.naive_bayes import GaussianNB X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=5) # 5、訓練數據 classifier_gaussiannb=GaussianNB() classifier_gaussiannb.fit(X_train,y_train) y_test_pred=classifier_gaussiannb.predict(X_test) # 6、提取性能指標 f1=cross_val_score(classifier_gaussiannb,X,y,scoring='f1_weighted',cv=5) print('f1:',str(round(f1.mean()*100,2))+'%') # 7、預測新的值 input_data = ['39', 'State-gov', '77516', 'Bachelors', '13', 'Never-married', 'Adm-clerical', 'Not-in-family', 'White', 'Male', '2174', '0', '40', 'United-States'] count=0 input_data_encoder=[-1]*len(input_data) for i,item in enumerate(input_data):if item.isdigit():input_data_encoder[i]=int(input_data[i])else:labels = []labels.append(input_data[i])input_data_encoder[i]=int(label_encoder[count].transform(labels))count=count+1result=classifier_gaussiannb.predict(input_data_encoder) result=label_encoder[-1].inverse_transform(result) print('resutl:',result)

轉載于:https://www.cnblogs.com/NSGUF/p/8274350.html

總結

以上是生活随笔為你收集整理的2、创建分类器笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。