国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python之機器學習庫scikit-learn

2019-11-09 14:34:04
字體:
來源:轉載
供稿:網友

一、 加載sklearn中的數據集datasets

from sklearn import datasetsiris = datasets.load_iris() # 鳶尾花卉數據digits = datasets.load_digits() # 手寫數字8x8像素信息數據查看數據的信息PRint iris.data[:4] # 查看數據的特征信息print iris.data.shape # 查看數據的特征信息維度print iris.target_names # 查看標簽對應的文本print iris.target[:4] # 查看數據的標簽 setosa:0 ...[[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2] [ 4.7 3.2 1.3 0.2] [ 4.6 3.1 1.5 0.2]](150L, 4L)['setosa' 'versicolor' 'virginica'][0 0 0 0]print digits.data[0]print digits.data.shapeprint digits.target[0]print digits.data[0].reshape((8,8)) # 重塑成8x8的像素數組[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3. 15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0. 0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12. 0. 0. 0. 0. 6. 13. 10. 0. 0. 0.](1797L, 64L)0[[ 0. 0. 5. 13. 9. 1. 0. 0.] [ 0. 0. 13. 15. 10. 15. 5. 0.] [ 0. 3. 15. 2. 0. 11. 8. 0.] [ 0. 4. 12. 0. 0. 8. 8. 0.] [ 0. 5. 8. 0. 0. 9. 8. 0.] [ 0. 4. 11. 0. 1. 12. 7. 0.] [ 0. 2. 14. 5. 10. 12. 0. 0.] [ 0. 0. 6. 13. 10. 0. 0. 0.]]

二、訓練集和分割集的分割

from sklearn.model_selection import train_test_splitX = digits.data # 特征矩陣y = digits.target # 標簽向量# 隨機分割訓練集和測試集:# test_size:設置測試集的比例。random_state:可理解為種子,保證隨機唯一X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=8) print X_train.shapeprint X_test.shape(1198L, 64L)(599L, 64L)

三、特征數值的歸一化

當特征的數值范圍差距較大時,需要對特征的數值進行歸一化,防止某些屬性的權重過大。(有時不需特征歸一化)

from sklearn import preprocessingimport numpy as npx1 = np.random.randint(0,10,1000).reshape((1000,1))x2 = np.random.randint(0,100,1000).reshape((1000,1))x3 = np.random.randint(0,10000,1000).reshape((1000,1))X = np.concatenate([x1,x2,x3],axis=1)print X[:4][[ 0 78 3423] [ 7 35 963] [ 7 63 9945] [ 3 60 6516]]# 特征數值歸一化print preprocessing.scale(X)[:4][[-1.59232736 0.96948157 -0.56718281] [ 0.83236081 -0.55950092 -1.40672255] [ 0.83236081 0.43611559 1.65862133] [-0.55317529 0.32944239 0.48838484]驗證歸一化的重要性# 生成分類數據進行驗證from sklearn import datasetsimport matplotlib.pyplot as plt%matplotlib inline# 生成分類數據:# n_sample:樣本個數、n_features:類別標簽種類數X, y = datasets.make_classification(n_samples=300, n_features=2, n_redundant=0, n_informative=2, random_state=25, n_clusters_per_class=1, scale=100)plt.scatter(X[:,0], X[:,1], c=y)plt.show()

這里寫圖片描述

使用svm模型(未特征歸一化時)# 使用svm模型(未特征歸一化時)from sklearn import svm# X = preprocessing.scale(X)# 分割訓練集合測試集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=7) svm_classifier = svm.SVC()# 訓練模型svm_classifier.fit(X_train, y_train)# 在測試集上對模型打分svm_classifier.score(X_test, y_test)0.52000000000000002使用svm模型(特征歸一化時)# 使用svm模型(特征歸一化時)from sklearn import svmX = preprocessing.scale(X)# 分割訓練集合測試集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=7) svm_classifier = svm.SVC()svm_classifier.fit(X_train, y_train)svm_classifier.score(X_test, y_test)0.97999999999999998

四、模型的訓練、預測與保存

以線性回歸模型為例iris = datasets.load_iris() # 鳶尾花卉數據X = iris.datay = iris.targetprint X[:3]print y[:3][[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2] [ 4.7 3.2 1.3 0.2]][0 0 0]# 選擇線性回歸模型from sklearn.linear_model import LinearRegression# 新建一個模型(參數默認)iris_model = LinearRegression()# 分割訓練集、測試集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=7) # 訓練該模型iris_model.fit(X_train,y_train)# 返回模型參數列表iris_model.get_params(){'copy_X': True, 'fit_intercept': True, 'n_jobs': 1, 'normalize': False}# 模型在訓練集上的評分iris_model.score(X_train, y_train)0.94505820275667418# 模型在測試集上的評分iris_model.score(X_test, y_test)0.89618390663189063# 使用模型進行預測y_pred = iris_model.predict(X_test)print '預測標簽:', y_pred[:3]print '真實標簽:', y_test[:3]預測標簽: [ 1.66080893 1.39414184 -0.02450645]真實標簽: [2 1 0]# 使用pickle保存模型import cPickle as picklewith open('LR_model.pkl', 'w') as f: pickle.dump(iris_model, f)# 重新加載模型進行預測with open('LR_model.pkl', 'r') as f: model = pickle.load(f)# 使用模型進行預測model.predict(X_test)[:3]array([ 1.66080893, 1.39414184, -0.02450645])

五、交叉驗證

在分割訓練集和測試集后,測試集一般用于對最后選擇的模型進行評分。而在選擇模型的超參數的過程中,為驗證/評價模型的好壞,需要在訓練集中取出一定比例的樣本作為驗證集來評價某個模型的好壞,訓練集中的其他樣本用來訓練模型。

為消除所選出來的驗證集中的樣本的特殊性,則需要將訓練集中的每一份樣本作為驗證集,其他樣本作為訓練集來訓練模型。若將訓練集中的樣本分為N分,最后會得到N個對該模型的評分,對這些評分取均值,即得到了交叉驗證的評分。

交叉驗證一般用來調整模型的超參數。

sklearn中的交叉驗證

cross_val_score函數用于交叉驗證,返回各個驗證集的評價得分。

from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scoreimport matplotlib.pyplot as plt%matplotlib inlineiris = datasets.load_iris()X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=5)以KNN模型為例# 使用KNN模型進行預測(K為超參數)from sklearn.neighbors import KNeighborsClassifier# 超參數K的范圍k_range = range(1,31)# 交叉驗證的評分集合cv_scores = []for k in k_range: knn = KNeighborsClassifier(k) # 構造模型 # 將訓練集均分為10份 #cv: 交叉驗證迭代器 scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy') # 分類問題使用 #scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='neg_mean_squared_error') # 回歸問題使用 cv_scores.append(scores.mean()) # # print cv_scores# 可視化各個k值模型的交叉驗證的平均分plt.plot(k_range,cv_scores)plt.xlabel('k')plt.ylabel('Accuracy')plt.show()

這里寫圖片描述

# 選擇最優的超參數Kbest_knn = KNeighborsClassifier(15)best_knn.fit(X_train, y_train)print best_knn.score(X_test, y_test)print best_knn.predict(X_test)1.0[1 2 2 0 2 1 0 1 0 1 1 2 2 2 0 0 2 2 0 0 1 2 0 1 1 2 1 1 1 2 0 1 1 0 1 0 0 2 0 2 2 1 0 0 1 2 1 2 2 0]

六、過擬合與欠擬合

過擬合:模型對于訓練集數據擬合程度過當,以致太適合訓練集數據而無法適應一般情況。即訓練出來的模型在訓練集上表現很好,在驗證集/測試集上表現并不好。

欠擬合:模型在訓練集/測試集上都表現得不是很好。

# 加載數據from sklearn.model_selection import learning_curvefrom sklearn.svm import SVCimport numpy as npdigits = datasets.load_digits()X = digits.datay = digits.target欠擬合情況# 繪制學習曲線(學習曲線:在不同訓練數據量下對訓練出來的模型進行評分)# gamma = 0.001train_sizes, train_scores, val_scores = learning_curve( SVC(gamma=0.001), X, y, cv=10, scoring='accuracy', train_sizes=[0.1, 0.25, 0.5, 0.75, 1])# train_sizes: 每次模型訓練的數量# train_scores: 每次模型在訓練集上的評分# val_scores:每次模型在驗證集上的交叉驗證評分# 求不同訓練數據量下的評分的均值train_scores_mean = np.mean(train_scores, axis=1) # 行均值val_scores_mean = np.mean(val_scores, axis=1)# 繪制學習曲線plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='training')plt.plot(train_sizes, val_scores_mean, '*-', color='g', label='cross validation')plt.xlabel('training sample size')plt.ylabel('accuracy')plt.legend(loc='best')plt.show()

這里寫圖片描述

如圖所示:當訓練數據量較少時,模型在交叉驗證中的得分較低,可看作一種欠擬合現象;隨著訓練數據量的增多,交叉驗證的平均分也隨之增加過擬合train_sizes, train_scores, val_scores = learning_curve( SVC(gamma=0.1), X, y, cv=10, scoring='accuracy', train_sizes=[0.1, 0.25, 0.5, 0.75, 1] )# 求不同訓練數據量下的評分的均值train_scores_mean = np.mean(train_scores, axis=1) # 行均值val_scores_mean = np.mean(val_scores, axis=1)# 繪制學習曲線plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='training')plt.plot(train_sizes, val_scores_mean, '*-', color='g', label='cross validation')plt.xlabel('training sample size')plt.ylabel('accuracy')plt.legend(loc='best')plt.show()

這里寫圖片描述

如圖所示:當訓練數據量較少時,模型在交叉驗證中的得分較低;然而,隨著訓練數據量的增多,交叉驗證的平均分并沒增多。因此出現過擬合現象。通過驗證曲線來觀察過擬合# 繪制驗證曲線(驗證曲線:在不同超參數下對模型的評分)from sklearn.model_selection import validation_curve# 設置SVC模型的超參數gamma的取值范圍gamma_range = np.arange(1, 10) / 3000.train_scores, val_scores = validation_curve( SVC(), X, y, param_name='gamma', param_range=gamma_range, cv=5, scoring='accuracy')# train_scores: 每次模型在訓練集上的評分# val_scores:每次模型在驗證集上的交叉驗證評分# 求每次的平均值train_scores_mean = np.mean(train_scores, axis=1)val_scores_mean = np.mean(val_scores, axis=1)# 繪制驗證曲線plt.plot(gamma_range, train_scores_mean, 'o-', color='r', label='training')plt.plot(gamma_range, val_scores_mean, '*-', color='g', label='cross validation')plt.xlabel('gamma')plt.ylabel('accuracy')plt.legend(loc='best')plt.show()

這里寫圖片描述

如圖所示:當gamma>0.0015時,出現過擬合現象,對應模型在訓練集上的評分不斷增大,而在驗證集上的評分反而在減小
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 塔河县| 桦甸市| 色达县| 罗定市| 达日县| 淮滨县| 乌拉特后旗| 保康县| 丹棱县| 宝兴县| 龙海市| 平阴县| 中卫市| 沈阳市| 平顶山市| 土默特左旗| 渭源县| 工布江达县| 桓台县| 江都市| 永丰县| 三门峡市| 荔波县| 蒲城县| 阜城县| 亚东县| 抚顺市| 景洪市| 监利县| 汤原县| 英吉沙县| 高平市| 潢川县| 绥化市| 光泽县| 克东县| 佛坪县| 浪卡子县| 玛多县| 图木舒克市| 怀仁县|