python機器學習---線性回歸案例和KNN機器學習案例


散點圖和KNN預測

一丶案例引入

#  城市氣候與海洋的關系研究
#  導包
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

import matplotlib.pyplot as plt
%matplotlib inline  # 使用畫圖模塊時,jupyter工具需要聲明


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


#  導入數據
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)


#  去除沒用的列
faenza.head()

city_list=[ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
for city in city_list:
    # 刪除 沒用的列,inplace:作用在源數據上
    city.drop(labels='Unnamed: 0',axis=1,inplace=True)
    
# 顯示最高溫度於離海遠近的關系(觀察多個城市)    
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
    自變量的變化會導致因變量的變化
# 畫散點圖, scatter(x,y,c):
	# 注意: x是自變量, y是因變量.  距離是自變量,最高溫度是因變量. rbyg是
plt.scatter(cities_dist,max_temp,c='rbyg')  
plt.xlabel('距離')
plt.ylabel('最高溫度')
plt.title('距離和最高溫度之間的關系圖')

二丶機器學習的概念

# 機器學習(ML)和人工智能之間的關系是什么?
	機器學習是實現人工智能的一種技術手段
# 什么是算法模型(model或者m)?
	特殊的對象。特殊之處就在於該對象內部集成了某一種還沒有求出解的方程。
# 算法模型的作用?
	實現預測:預測出一個未知的結果
	實現分類:將一個未知分類的事務歸類到已知的類群中
	重點:算法模型中的方程的解就是預測或者分類的結果

#樣本數據
	作用:將樣本數據帶入到算法模型中讓其內部的方程有解。至此算法模型就可以實現分類或者預測的功能。
	訓練模型:將樣本數據帶入到算法模型中讓其內部的方程有解。只有訓練好的算法模型才可以實現分類或者預測的功能!
	
	組成部分:
		特征數據:自變量	
		目標數據:因變量

#sk-learn庫:封裝了大量的算法模型

# 模型的分類:
	有監督學習:如果模型需要的樣本數據必須包含特征數據和目標數據
	無監督學習:如果模型需要的樣本只需要有特征數據
# 導入sklearn,建立線性回歸算法模型對象
	# 該模型內部封裝的是一個線性方程:y = wx + b
	
### 1. 提取樣本數據 (特征數據,目標數據)

    feature = np.array(cities_dist)  #特征數據 
    feature = feature.reshape(-1, 1) #二維形式的特征數據(reshape把數據變形,訓練的數據必須是二維)
    target =  np.array(max_temp)     #目標數據
    
    
### 2. 訓練模型調用的方法是fit(X,y),y任意形式(維度)的目標數據,X表示的必須是二維的特征數據
    #1.選擇一個模型對象進行實例化
    from sklearn.linear_model import LinearRegression
    # 實例化一個 線性回歸對象
    linner = LinearRegression()
   
	#2.訓練模型(注意:訓練模型的數據必須是二維)
    linner.fit(feature,target) #X,y
    
    #3.使用相關的評價指標來評價模型
    linner.score(feature,target)
    #4.實現預測
    linner.predict([[222],[333]]) 
    
    
#### 3. 畫出回歸曲線
x = np.linspace(0,350,num=100)  # x 生成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)    

三丶k-近鄰算法(KNN)

k-近鄰算法原理

# 簡單地說,K-近鄰算法采用測量不同特征值之間的距離方法進行分類。

	# 優點:精度高(計算距離)、對異常值不敏感(單純根據距離進行分類,會忽略特殊情況)、無數據輸入假定(不會對數據預先進行判定)。
	# 缺點:時間復雜度高、空間復雜度高。
	# 適用數據范圍:數值型和標稱型。
    

歐幾里得距離(Euclidean Distance)

# 歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:


案例一:

需求:預測年收入是否大於50K美元

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


# 1.  讀取數據
    data = pd.read_csv('../data/adults.txt')
    data.head()
 


# 2. 獲取年齡、教育程度、職位、每周工作時間作為機器學習數據 獲取薪水作為對應結果    
    feature = data[['age','education_num','occupation'
                    ,'hours_per_week']]
    target = data['salary']
    
    
# 3. knn中特征數據是需要參與運算的,所以要保證特征數據必須為數值型的數據 
	 # 數據轉換,將String類型數據轉換為int
     #### map方法,進行數據轉換
        
  	dic = {}
    # unique()方法保證數據唯一
    occ_arr = feature['occupation'].unique()
    # 生成 字符對應數字的 關系表
    for i in range(occ_arr.size):
        dic[occ_arr[i]] = i  

# 數值替換字符串        
feature['occupation'] = feature['occupation'].map(dic)    
    
    
    
# 4. 切片:訓練數據和預測數據  

	# 查看數據的形狀 (訓練的數據必須是二維數據)
    feature.shape
    
#訓練數據
x_train = feature[:32500]
y_train = target[:32500]

#測試數據
x_test = feature[32500:]
y_test = target[32500:]	  


# 5. 生成算法
from sklearn.neighbors import KNeighborsClassifier
 # 實例化一個 knn對象, 
    # 參數:n_neighbors可調,調到最終預測的是最好的結果.
knn = KNeighborsClassifier(n_neighbors=10)
	# fit() 訓練函數, (訓練數據,訓練數據的結果)
    knn.fit(x_train,y_train)
    
    # 對訓練的模型進行評分 (測試數據,測試數據的結果)
	knn.score(x_test,y_test)
    
    
# 6.預測數據
print('真實的分類結果:',np.array(y_test))
print('模型的分類結果:',knn.predict(x_test))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM