機器學習

機器學習

1. 機器學習的引入

城市氣候與海洋的關係研究 :python

導入包 :算法

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

import matplotlib.pyplot as plt
%matplotlib inline


from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示爲方塊的問題

導入數據 :api

ferrara1 = pd.read_csv('./ferrara_150715.csv')
ferrara2 = pd.read_csv('./ferrara_250715.csv')
ferrara3 = pd.read_csv('./ferrara_270615.csv')
ferrara=pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True)
# ignore_index=True 表示的是忽略顯式的行索引
...

刪除沒用的列 :app

# 循環刪除每一個表的'Unnamed: 0'列
city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
for city in city_list:
    city.drop(labels='Unnamed: 0',axis=1,inplace=True) # 加入inplace=True就會改寫源數據

部分數據 :dom

temp humidity pressure description dt wind_speed wind_deg city day dist
0 29.40 83 1015 moderate rain 1436863177 3.62 94.001 Faenza 2015-07-14 10:39:37 37
1 30.12 78 1015 moderate rain 1436866759 3.10 80.000 Faenza 2015-07-14 11:39:19 37

顯示最高溫度於離海遠近的關係(觀察多個城市):機器學習

max_temp = [] #10個城市的最高溫度
cities_dist = [] #10個城市距離海洋的距離

for city in city_list:
    max_temp.append(city['temp'].max())
    cities_dist.append(city['dist'].max())
  • 在方程式中:
    • x:自變量
    • y:因變量
    • y = 5x + 4
    • 自變量的變化會致使因變量的變化

生成散點圖 :學習

plt.scatter(cities_dist,max_temp,c='rbyg') # c='rbyg'表示顏色
plt.xlabel('距離')
plt.ylabel('最高溫度')
plt.title('距離和最高溫度之間的關係圖')

# 基於當前的關係模式將某一個未知最高溫度的城市的最高溫度進行預測

機器學習

1. 機器學習 - 線性迴歸算法模型

  • 機器學習(ML)和人工智能之間的關係是什麼?
    • 機器學習是實現人工智能的一種技術手段
  • 什麼是算法模型(model或者m)?
    • 特殊的對象。特殊之處就在於該對象內部集成了某一種尚未求出解的方程。
  • 算法模型的做用?
    • 實現預測:預測出一個未知的結果
    • 實現分類:將一個未知分類的事務歸類到已知的類羣中
    • 重點:算法模型中的方程的解就是預測或者分類的結果
  • 樣本數據
    • 做用:將樣本數據帶入到算法模型中讓其內部的方程有解。至此算法模型就能夠實現分類或者預測的功能。
    • 訓練模型:將樣本數據帶入到算法模型中讓其內部的方程有解。只有訓練好的算法模型才能夠實現分類或者預測的功能!
    • 組成部分:
      • 特徵數據:自變量
      • 目標數據:因變量
  • sk-learn庫:封裝了大量的算法模型
  • 模型的分類:
    • 有監督學習:若是模型須要的樣本數據必須包含特徵數據和目標數據
    • 無監督學習:若是模型須要的樣本只須要有特徵數據

導入sklearn,創建線性迴歸算法模型對象

  • 該模型內部封裝的是一個線性方程:y = wx + b
  1. 提取樣本數據(特徵數據,目標數據)測試

    feature = np.array(cities_dist)  #特徵數據 
    feature = feature.reshape(-1, 1) #二維形式的特徵數據
    target =  np.array(max_temp)     #目標數據

    訓練模型調用的方法是fit(X,y),y任意形式(維度)的目標數據,X表示的必須是二維的特徵數據字體

  2. 選擇一個模型對象進行實例化人工智能

    from sklearn.linear_model import LinearRegression
    linner = LinearRegression()
  3. 訓練模型

    linner.fit(feature,target) # X,y X必須是二維的特徵數據
  4. 使用相關的評價指標來評價模型

    linner.score(feature,target)
  5. 實現預測

    linner.predict([[222],[333]])

畫出迴歸曲線 :

x = np.linspace(0,350,num=100)
y = linner.predict(x.reshape(-1,1))
plt.scatter(cities_dist,max_temp,c='rbyg')
plt.xlabel('距離')
plt.ylabel('最高溫度')
plt.title('距離和最高溫度之間的關係圖')

plt.scatter(x,y)

2. K-近鄰算法(KNN)

1. k-近鄰算法原理

簡單地說,K-近鄰算法採用測量不一樣特徵值之間的距離方法進行分類。
- 優勢:精度高(計算距離)、對異常值不敏感(單純根據距離進行分類,會忽略特殊狀況)、無數據輸入假定(不會對數據預先進行斷定)。
- 缺點:時間複雜度高、空間複雜度高。
- 適用數據範圍:數值型和標稱型。

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

用於分類 :

導包,機器學習的算法KNN、數據藍蝴蝶

import sklearn.datasets as datasets
datasets.load_iris()  # datasets提供了不一樣的樣本數據,根據不一樣的樣本數據訓練出來,就將會有不一樣的功能

預測年收入是否大於50K美圓 :

讀取adult.txt文件,最後一列是年收入,並使用KNN算法訓練模型,而後使用模型預測一我的的年收入是否大於50

# 讀取數據
import pandas as pd
import numpy as np
data = pd.read_csv('../data/adults.txt')
data.head()

部分數據展現

age workclass final_weight education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary
0 39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States <=50K
1 50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States <=50K

獲取年齡、教育程度、職位、每週工做時間做爲機器學習數據
獲取薪水做爲對應結果

feature = data[['age','education_num','occupation','hours_per_week']]
target = data['salary']

knn中特徵數據是須要參與運算的,因此要保證特徵數據必須爲數值型的數據

feature.head(2)

age education_num occupation hours_per_week
0 39 13 Adm-clerical 40
1 50 13 Exec-managerial 13

數據轉換,將String類型數據轉換爲int (occupation轉換成數字)

# map方法,進行數據轉換
dic = {}
occ_arr = feature['occupation'].unique()
for i in range(occ_arr.size):
    dic[occ_arr[i]] = i
feature['occupation'] = feature['occupation'].map(dic)

切片:訓練數據和預測數據

#訓練數據
x_train = feature[:32500]
y_train = target[:32500]
#測試數據
x_test = feature[32500:]
y_test = target[32500:]

生成算法

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=10)  # n_neighbors調整精度用的K
knn.fit(x_train,y_train)
knn.score(x_test,y_test)

第二步:預測數據

print('真實的分類結果:',np.array(y_test))
print('模型的分類結果:',knn.predict(x_test))

3. KNN手寫數字識別

導包

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

加載數據

#./data/6/6_66.bmp
feature = []
target = []
for i in range(10): #i表示的文件夾的名稱
    for j in range(1,501):
        img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp'
        img_arr = plt.imread(img_path)
        feature.append(img_arr)
        target.append(i)

提取樣本數據

feature = np.array(feature)  #必須保證是二維
target = np.array(target)
feature.shape  # (5000, 28, 28) 目前的特徵是3維

特徵處理:將三維的特徵變造成二維

feature = feature.reshape((5000,-1))
feature.shape  # (5000, 784)

對樣本數據進行拆分

#對樣本數據進行打亂
# 利用random進行隨機打亂且固定隨機因子,使數據保持對應關係
np.random.seed(10)
np.random.shuffle(feature)
np.random.seed(10)
np.random.shuffle(target)

#拆分
x_train = feature[:4950]
y_train = target[:4950]
x_test = feature[4950:]
y_test = target[4950:]

實例化模型對象,而後對其進行訓練

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(x_train,y_train)
knn.score(x_test,y_test)

測試數據

print('真實的分類結果:',y_test)
print('模型的分類結果:',knn.predict(x_test))

保存模型

from sklearn.externals import joblib
joblib.dump(knn,'./knn.m')


使用模型識別外部的數字圖片

讀取模型

knn = joblib.load('./knn.m')
knn

讀取須要識別的圖片

img_arr = plt.imread('./數字.jpg')
plt.imshow(img_arr)
img_arr.shape # (241, 257, 3) 三維

裁切圖片

eight_img = img_arr[180:235,90:130,:]
plt.imshow(eight_img)

feature[0].shape  # (784,)

模型能夠識別的圖片的維度是取決於樣本數據的

  • 能夠識別的圖片是28*28像素
  • 圖片是沒有顏色這個維度
  • 模型識別的圖片(784,)

降維

eight_img.shape #  (55, 40, 3)
eight_img = eight_img.mean(axis=2)
eight_img.shape # (55, 40)

對降維以後的圖片的像素進行等比例壓縮

import scipy.ndimage as ndimage
eight_img = ndimage.zoom(eight_img,zoom=(28/55,28/40))
eight_img.shape # (28, 28)
eight_img = eight_img.reshape(1,-1)
eight_img.shape # (1,784)

識別

knn.predict(eight_img) # array([8])
相關文章
相關標籤/搜索