Scikit-learn是個簡單高效的數據分析工具,它其中封裝了大量
的機器學習算法,內置了大量的公開數據集,並且擁有完善的文檔。
1 用KNN算法實現鳶尾花的分類
鳶尾花是在模式識別文獻中最有名的數據庫。數據集包含3個類,每類有50個實例,每個類指向一種類型的鳶尾花。一類與另外兩類線性分離,而後者不能彼此線性分離。
鳶尾花數據集特徵:
屬性數量: 4 (數值型,數值型,幫助預測的屬性和類)
屬性信息: |
---|
sepal length 萼片長度(釐米) |
sepal width 萼片寬度(釐米) |
petal length 花瓣長度(釐米) |
petal width 花瓣寬度(釐米) |
類別: |
---|
Iris-Setosa 山鳶尾 |
Iris-Versicolour 變色鳶尾 |
Iris-Virginica 維吉尼亞鳶尾 |
步驟1 用sklearn中的load_iris讀取數據集,查看特徵值的前兩行和分類情況。
import numpy as np
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris =datasets.load_iris()
iris_X=iris.data#特徵值
iris_y=iris.target#分類
print(iris_X[:2,:])
print(iris_y)
運行結果:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
步驟2 把所有的數據集按7:3的比例分爲訓練數據集和測試數據集。輸出的y_train被分開並且打亂了順序。
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)
print(y_train)
運行結果:
[0 0 2 1 1 1 0 0 0 2 0 0 1 1 0 2 1 0 2 2 2 2 1 0 1 2 0 0 1 0 0 1 0 2 0 0 2 2 2 2 2 0 1 1 2 2 2 1 0 1 0 0 1 2 1 2 1 0 1 0 0 0 2 2 0 0 1 2 0 2 1 0 0 0 1 2 2 1 0 1 1 2 1 2 0 1 0 1 1 0 1 0 1 2 2 2 2 0 1 0 1 2 0 1 0]
步驟3 進行分類訓練和測試。在測試時,knn.predict(X_test)爲測試集特徵的預測值,把它和測試集的真實值做比較。
knn=KNeighborsClassifier()
knn.fit(X_train,y_train)
print(knn.predict(X_test))
print(y_test)
運行結果:
[2 0 2 0 0 0 1 2 1 0 2 1 2 2 1 0 0 2 0 1 2 2 0 1 2 1 2 1 2 2 0 1 0 1 0 2 0 1 0 1 0 2 1 0 2]
[2 0 2 0 0 0 1 2 1 0 2 1 2 2 1 0 0 2 0 1 2 2 0 1 2 1 1 1 2 2 0 1 0 1 0 2 0 1 0 1 0 2 1 0 2]
最終預測的分類和實際的分類很接近,但是還是存在一點錯誤。
2 Scikit-learn線性迴歸預測糖尿病
糖尿病數據集是在442例糖尿病患者中獲得了十個基線變量,年齡,性別,體重,平均血壓和六個血清測量值,以及興趣愛好,基線後一年的疾病進展的定量測量。
線性迴歸:給定數據集中每個樣本及其正確答案,根據給定的訓練數據訓練一個模型函數h(hypothesis,假設),目標是找到使殘差平方和最小的那個參數。
本例中爲了闡述線性迴歸的二維圖,只使用了糖尿病數據集的第一個特徵。本例將會訓練出一條直線,使得預測值和正確答案的殘差平方和最小。最後還計算參數,殘差平方和和方差分數。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
# 載入糖尿病數據集
diabetes = datasets.load_diabetes()
# 只使用數據集的第一個特徵
diabetes_X = diabetes.data[:, np.newaxis, 2]
# 把特徵分爲訓練數據集和測試數據集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# 把類型分爲訓練數據集和測試數據集
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
# 創建一個線性迴歸對象
regr = linear_model.LinearRegression()
# 用訓練數據集訓練模型
regr.fit(diabetes_X_train, diabetes_y_train)
# 用測試數據集做預測
diabetes_y_pred = regr.predict(diabetes_X_test)
# 迴歸方程的係數
print('Coefficients: \n', regr.coef_)
# 均方誤差
print("Mean squared error: %.2f"
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# 解釋方差分數:1代表預測的好
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
# 畫出二維的測試數據集圖形
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
# 畫出擬合圖形
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
運行結果:
Coefficients:
[938.23786125]
Mean squared error: 2548.07
Variance score: 0.47
感謝您的閱讀,如果您喜歡我的文章,歡迎關注我哦