白話 sklearn 模塊

0. 流程

  1. 實例化使用的模型類,獲得一個模型對象
  2. 對象.fit(feature, target), 訓練模型
  3. 對象.predict(data),獲得預測的target

1. 城市氣候與海洋的關係研究

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']          # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False              # 解決保存圖像是負號'-'顯示爲方塊的問題
# 同一城市的數據進行級聯
pd.concat([df1, df2, df3], ignore_index=True)
plt.scatter(li1, li2)
plt.xlabel = 'distance'
plt.ylabel = 'temperature'
plt.title = 'dis-temp'

2. sklearn模塊

  • Anaconda 中集成
  • 線性模型
  • 樹模型

1. 概念

  1. 人工智能和機器學習之間的關係
    • 機器學習是實現人工智能的一種技術手段
  2. 算法模型
    1. 概念:特殊對象該對象內部封裝了某種尚未求出解的方程
    2. 做用:實現預測或分類
    3. 對象內部封裝的方程的解就是算法模型預測或分類的結果
    4. 分類
      • 有監督學習:若是算法模型對象須要的樣本數據必須有特徵數據和目標數據
      • 無監督學習:只須要特徵數據便可
  3. 樣本數據
    1. 訓練模型:樣本數據和算法模型之間的關係(須要將樣本數據帶入到模型對象中,讓模型對象的方程求出解)
    2. 算法模型的樣本數據:千億級別的樣本數據
    3. 樣本數據:由特徵數據(自變量,每每是由多種特徵組成)和目標數據(因變量)組成

2. 線性迴歸算法模型(預測)

# 創建一個溫度模型,讓其能夠根據距離,預測出該距離對應城市的最高溫度
# 導入sklearn,創建線性迴歸模型
from sklearn.linear_model import LinearRegression
# 實例化算法模型對象, y = kx + b
linear = LinearRegression()

# 樣本數據提取,通常封裝到 np的 array 中
feature = np.array(distance)
target = np.array(max_temp)
# 訓練模型,特徵數據必須是二維的
linear.fit(feature.reshape(-1,1), target)
# 基於訓練好的模型對象實現預測功能(獲取方程解)
linear.predict([[266],[333]])

x = np.linspace(0, 400, num=100)
y = linear.predict(x.reshape[-1,-1])
plt.scatter(distance, max_temp)
plt.scatter(x, y)

3. KNN(分類算法模型)

1. k-近鄰算法原理

  • 俗稱:k近鄰、K:數值,N:nearest,N:neighbor
  • 歐幾里德距離:Euclidean Distance
  • 簡單地說,K-近鄰算法採用測量不一樣特徵值之間的距離方法進行分類。
    1. 優勢:精度高、對異常值不敏感、無數據輸入假定。
    2. 缺點:時間複雜度高、空間複雜度高。
    3. 適用數據範圍:數值型和標稱型。

2. 工做原理

  • 存在一個樣本數據集合,也稱做訓練樣本集,而且樣本集中每一個數據都存在標籤,即咱們知道樣本集中每一數據 與所屬分類的對應關係。輸入沒有標籤的新數據後,將新數據的每一個特徵與樣本集中數據對應的特徵進行比較,而後算法提取樣本集中特徵最類似數據(最近鄰)的分類標籤。通常來講,咱們 只選擇樣本數據集中前K個最類似的數據,這就是K-近鄰算法中K的出處,一般K是不大於20的整數。 最後 ,選擇K個最類似數據中出現次數最多的分類,做爲新數據的分類。
  • 使用K-近鄰算法分類愛情片和動做片。有人曾經統計過不少電影的打鬥鏡頭和接吻鏡頭,假若有一部未看過的電影,如何肯定它是愛情片仍是動做片呢?咱們可使用K-近鄰算法來解決這個問題。

3. 在scikit-learn庫中使用k-近鄰算法

  • 分類問題:from sklearn.neighbors import KNeighborsClassifier
  • 迴歸問題:from sklearn.neighbors import KNeighborsRegressor
# scikit-learn庫庫中使用k-近鄰算法
df = pd.read_csv('./film.txt')
feature = df[['Action lens'],['Love lens']]
target = df['target']
# 導入模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(feature, target)
# knn模型訓練打分結果
knn.score(feature, target)
knn.predict([[30], [50]])

4. sklearn提供的數據

  • 提供機器學習的測試數據
# 提供機器學習的測試數據
from sk-learn.datasets as datasets
datasets.load_iris()
# 訓練數據
x_train = feature[0:32500]
y_train = target[0:32500]
# 測試數據,測試模型的精準度
x_test = feature[32500:]
y_test = target[32500:]
# 實例化模型
knn = KNeighborsClassifier(n_neighbors=30)
knn.fit(x_train, y_train)
knn.score(x_train, y_train)
# 測試模型精準度
print(knn.predict(x_test), y_test)

3. 手寫數據識別(示例)

  1. 圖片數據是二維的,放入list中,在轉換爲 array 時,就會變成三維數組
  • 先把把圖片數組轉換爲一維數組便可
  1. 樣本數據的訓練數據必須是二維的
  • 降維操做:df.mean(axis=2) axis表示去掉哪一維數據
  1. 圖片的像素壓縮python

    • import scipy.ndimage as ndimages
    • ndimages(df, zoom=(目標像素/當前圖片像素,目標像素/當前圖片像素))算法

    • df.reshape((1, -1)):轉換爲 1 * n 的數組數組

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearing.neighbors import KNeighborsClassifier

# 1.提取樣本數據
feature = []
target = []
for i in range(10):
    for j in range(1, 501):
        img_path = f'./data/{i}/{i}_{j}.bmp'
        img_arr = plt.imread(img_path)
        feature.append(img_arr)
        target.append(i)

# 2.將list類型樣本轉爲 array 形式
feature = np.array(feature)
target = np.array(target)

# 3.特徵數據是三維的,不可做爲訓練數組,必須轉換成二維數組
feature = feature.reshape((5000, 784))
# 只能固定一個隨機函數的隨機因子
np.random.seed(10)
np.random.shuffle(feature)
np.random.seed(10)
np.random.shuffle(feature)
# 訓練數據和測試數據
x_train = feature[:4980]
y_train = target[:4980]
x_test = feature[4980:]
y_test = target[4980:]
# 4.生成訓練模型
knn = KNeighborsClassfier(n_negihbors=17)
knn.fit(x_train, y_train)
knn.score(x_train, y_train)

print(knn.predict(x_test))
print(y_test)

# 5.將訓練好的模型進行保存
from sklearn.externals import joblib
joblib.dump(knn, './knn.m')
# 加載保存的模型
knn = joblib.load('./knn.m')

# 6.讓模型對外部一張圖片進行識別(應用)
ex_img = plt.imread('./test.jpg')
# 將多個數字進行裁剪
img_two = ex_img[:70,130:185,:]
# 外部圖片數據是三維,實現降維
img_two = img_two.mean(axis=2)
# 像素調整,等比例壓縮
import scipy.ndimage as ndimages
img_two = ndimage.zoom(img_two, zoom=(28/75, 28/55))
# 將圖片轉換爲一維數組
img_two = img_two.reshape((1, -1))
knn.predict(img_two)
相關文章
相關標籤/搜索