import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
複製代碼
from sklearn.datasets import load_iris
iris_dataset = load_iris()
複製代碼
load_iris 返回的 iris 對象是一個Bunch對象,與字典很是類似,裏面包含鍵和值. 這個類直接繼承dict類,因此咱們能夠天然而然地得到dict類地大量功能,好比對鍵/值的遍歷,或者簡單查詢一個屬性是否存在。python
Bunch結構構建方法(應該是在sklearn包裏):
class Bunch(dict):
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
self.__dict__ = self
複製代碼
*參數,能夠使函數接受任意數量的位置參數算法
def avg(first, *rest):
return (first + sum(rest)) / (1 + len(rest))
# Sample use
avg(1, 2) # 1.5
avg(1, 2, 3, 4) # 2.5
複製代碼
**參數,使函數接受任意數量的關鍵字參數數組
def make_element(name, value, **attrs):
....
make_element('item', 'Albatross', size='large', quantity=6)
複製代碼
例子:bash
x = Bunch(a='1',b='2',c='3')
print(x.a)
print(x.b)
print(x.c)
輸出:
1
2
3
複製代碼
T = Bunch
t = T(left = T(left='a',right='b'),right = T(left='c'))
print(t.left)
print(t.left.right)
print(t['left']['right'])
print('left' in t.right)
print('right' in t.right)
輸出:
{'left': 'a', 'right': 'b'}
b
b
True
False
複製代碼
print('Keys of iris_dataset: \n{}'.format(iris_dataset.keys()))
輸出:
Keys of iris_dataset:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
複製代碼
target_names 鍵對應的值是一個字符串數組,裏面包含咱們要預測的花的品種:dom
print('Target names: {}'.format(iris_dataset['target_names']))
輸出:
Target names: ['setosa' 'versicolor' 'virginica']
複製代碼
feature_names 鍵對應的值是一個字符串列表,對每個特徵進行了說明:機器學習
print('Feature names: \n{}'.format(iris_dataset['feature_names']))
輸出:
Feature names:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
複製代碼
數據包含在 target 和 data 字段中。data裏面是花萼長度、花萼寬度、花瓣長度、花瓣寬 度的測量數據,格式爲 NumPy 數組。 data數組的每一行對應一朵花,列表明每朵花的四個測量數據 shape函數能夠查看矩陣或數組的維數,(150,4)指的是是一個150行,4列的數組:函數
print('Type of data: {}'.format(type(iris_dataset['data'])))
print('Shape of data: {}'.format(iris_dataset['data'].shape))
輸出:
Type of data: <class 'numpy.ndarray'>
Shape of data: (150, 4)
複製代碼
前 5 個樣 本的特徵數值:學習
print('First five rows of data:\n{}'.format(iris_dataset['data'][:5]))
輸出:
First five rows of data:
[[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]
[5. 3.6 1.4 0.2]]
複製代碼
機器學習中的個體叫做樣本(sample),其屬性叫做特徵(feature)。 data 數組的形狀(shape)是樣本數乘以特徵數。
target 數組包含的是測量過的每朵花的品種,也是一個 NumPy 數組。target 是一維數組,每朵花對應其中一個數據。數字的表明含義由 iris_dataset['target_names']
數組給出 0 表明 setosa,1 表明 versicolor,2 表明 virginica:測試
print('Type of target:{}'.format(type(iris_dataset['target'])))
print('Shape of target: {}'.format(iris_dataset['target'].shape))
print('Target:\n{}'.format(iris_dataset['target']))
輸出:
Type of target:<class 'numpy.ndarray'>
Shape of target: (150,)
Target:
[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]
複製代碼
scikit-learn 中的 train_test_split
函數能夠打亂數據集並進行拆分。 scikit-learn 中的數據一般用大寫的 X 表示,而標籤用小寫的 y 表示。 在對數據進行拆分以前,train_test_split
函數利用僞隨機數生成器將數據集打亂 爲了確保屢次運行同一函數可以獲得相同的輸出,利用random_state參數指定了隨機數生成器的種子。 這樣函數輸出就是固定不變的,因此這行代碼的輸出始終相同。ui
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'],random_state=0)
複製代碼
train_test_split
函數的輸出爲X_train
、X_test
、y_train
和 y_test
,它們都是NumPy數組。 X_train
包含 75% 的行數據,X_test
包含剩下的25%:
print('X_train shape: {}'.format(X_train.shape))
print('y_train shape: {}'.format(y_train.shape))
print('X_test shape: {}'.format(X_test.shape))
print('y_test shape: {}'.format(y_test.shape))
輸出:
X_train shape: (112, 4)
y_train shape: (112,)
X_test shape: (38, 4)
y_test shape: (38,)
複製代碼
利用X_train中的數據建立DataFrame. 利用iris_dataset['feature_names']
中的字符串對數據列進行標記. 利用DataFrame建立散點圖矩陣,按y_train着色.
iris_dataframe = pd.DataFrame(X_train,columns = iris_dataset['feature_names'])
grr = pd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),
marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
複製代碼
注:mglearn包爲書中做者本身寫的包
scikit-learn 中全部的機器學習模型都在各自的類中實現,這些類被稱爲Estimator 類。 k近鄰分類算法是在neighbors模塊的KNeighborsClassifier類中實現的。 咱們須要將這個類實例化爲一個對象,而後才能使用這個模型。這時咱們須要設置模型的參數。 KNeighborsClassifier最重要的參數就是鄰居的數目,這裏咱們設爲1
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
複製代碼
knn對象對算法進行了封裝,既包括用訓練數據構建模型的算法,也包括對新數據點進行預測的算法。 它還包括算法從訓練數據中提取的信息。對於KNeighborsClassifier來講,裏面只保存了訓練集。
想要基於訓練集來構建模型,須要調用 knn 對象的 fit 方法, 輸入參數爲 X_train
和y_ train
,兩者都是 NumPy 數組, 前者包含訓練數據,後者包含相應的訓練標籤
knn.fit(X_train,y_train)
複製代碼
fit 方法返回的是 knn 對象自己並作原處修改,所以咱們獲得了分類器的字符串表示。 從中能夠看出構建模型時用到的參數
假如在野外發現了一朵鳶尾花, 花萼長5cm 寬 2.9cm,花瓣長1cm 寬 0.2cm。想知道這朵鳶尾花屬於哪一個品種? 咱們能夠將這些數據放在一個 NumPy數組中, 再次計算形狀,數組形狀爲樣本數(1)乘以特徵數(4):
X_new = np.array([[5,2.9,1,0.2]])
複製代碼
咱們將這朵花的測量數據轉換爲二維 NumPy 數組的一行, 這是由於 scikit-learn 的輸入數據必須是二維數組
調用 knn 對象的 predict 方法來進行預測:
prediction = knn.predict(X_new)
print('Prediction:{}'.format(prediction))
print('Predicted target name:{}'.format(iris_dataset['target_names'][prediction]))
輸出:
Prediction:[0]
Predicted target name:['setosa']
複製代碼
即根據模型的預測,這朵新的鳶尾花屬於類別 0,也就是說它屬於 setosa 品種
最後評估模型 對測試數據中的每朵鳶尾花進行預測,並將預測結果與標籤(已知的品種)進行對比。 咱們能夠經過計算精度(accuracy)來衡量模型的優劣,精度就是品種預 測正確的花所佔的比例:
y_pred = knn.predict(X_test)
print('Test set predictions:\n{}'.format(y_pred))
print('Test set score:{:.2f}'.format(np.mean(y_pred == y_test)))
#保留小數後兩位
輸出:
Test set predictions:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2]
Test set score:0.97
複製代碼
關於format函數的使用方法詳見: www.runoob.com/python/att-…