初步學習Scikit-learn(sklearn)

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

9


感謝您的閱讀,如果您喜歡我的文章,歡迎關注我哦

10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章