「 數據挖掘算法基於線性代數、機率論、信息論推導,深刻進去仍是頗有意思的,可以理解數學家、統計學家、計算機學家的智慧,這個專欄從比較簡單的經常使用算法入手,後續研究基於TensorFlow的高級算法,最好可以參與到人臉識別和NLP的實際項目中,作出來必定的效果。」python
首先講迴歸模型,迴歸模型研究的是因變量(目標)和自變量(預測器)之間的關係,因變量能夠是連續也能夠離散,若是是離散的就是分類問題。思考房價預測模型,咱們能夠根據房子的大小、戶型、位置、南北通透等自變量預測出房子的售價,這是最簡單的迴歸模型,在初中裏面迴歸表達式通常這樣寫,其中x是自變量,y是因變量,w是特徵矩陣,b是偏置。git
在機器學習推導裏面引入線性代數的思想,將假設咱們用一個表達式來描述放假預測模型,x表明一個房子的特徵集,它是一個n×1的列向量,總共有m個特徵集,θ是一個n×1的列向量,是咱們想要求得未知數。github
咱們採用偏差最小的策略,好比有預測表達式:y工資=Θ1*學歷+Θ2*工做經驗+Θ3*技術能力+.......+Θn*x+基本工資,預測的y值和實際值y_存有差距,策略函數就是使得m個特徵集的(真實值y-預測值)的平方和最小。(差值多是負數,因此採用平方和);算法
按照對於正規方程的求法,咱們對θ 求偏導:app
也就是,給定特徵矩陣X和因變量y,便可以求使偏差率最小的θ值,知足後續的迴歸模型。瞭解線性代數的童靴能夠看出來問題,在θ的表達式中有求逆運算,須要保證矩陣可逆,這通常是沒法保證的,這樣就會形成θ無解,策略失效;dom
常規的方程須要大量的矩陣運算,尤爲是矩陣的逆運算,在矩陣很大的狀況下,會大大增長計算複雜性。,且正規方程法對矩陣求偏導有必定的侷限性(沒法保證矩陣可逆),下面介紹梯度降低法,也就是計算機的解決方法,每次走一小步,保證這一小步是最有效的一步,能夠想象本身正在下山,你不知道目的地(全局最小值)在哪,可是你可以保證本身每次走的都是最陡峭的一步;機器學習
咱們的策略仍然保持不變,就是使得m個特徵集的(真實值y-預測值)的平方和最小:函數
梯度降低法實現:賦予初始θ 值,並根據公式逐步更新θ 使得J(θ) 不斷減小,最終至收斂,對應的參數θ 即爲解。爲了推導方便,首先研究只有一個訓練樣本時,如何計算推導公式。學習
θ 的每一個份量更新公式爲:測試
推廣到m個訓練數據,參數更新公式爲:
邏輯迴歸與線性迴歸同屬廣義線性模型,邏輯迴歸是以線性迴歸爲理論支持,是一個二分類模型,也能夠推廣多到分類問題,經過Sigmoid函數引入了非線性因素,所以能夠輕鬆處理0/1分類問題,首先介紹一下Sigmoid函數:
sigmoid函數圖像是一個S曲線,取值在[0, 1]之間,在遠離0的地方函數的值會很快接近0或者1,sigmoid函數的求導特性是:
邏輯迴歸的預測函數是下圖,只是在特徵到結果的映射中加入了一層函數映射,先把特徵線性求和,而後使用函數g(z)將最爲假設函數來預測。g(z)能夠將連續值映射到0到1之間:
經過求似然函數,兩邊取log後,對θ求偏導:
這樣咱們就獲得了梯度上升每次迭代的更新方向,那麼θ的迭表明達式爲:
發現同線性迴歸模型是同一個表達式,這並不只僅是巧合,二者存在深層的聯繫;
數據是2014年5月至2015年5月美國King County的房屋銷售價格以及房屋的基本信息。數據分爲訓練數據和測試數據,分別保存在kc_train.csv和kc_test.csv兩個文件中,其中訓練數據主要包括10000條記錄,14個字段:銷售日期,銷售價格,臥室數,浴室數,房屋面積,停車面積,樓層數,房屋評分,建築面積,地下室面積,建築年份,修復年份,緯度,經度。
數據集地址:https://github.com/yezonggang/house_price,按照流程完成模型創建:
import pandas as pd from pandas import DataFrame import numpy as np import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LinearRegression # 數據讀取 baseUrl="C:\\Users\\71781\\Desktop\\2020\\ML-20200422\\houre_price\\" house_df=pd.read_csv(baseUrl+'train.csv' ) test_df=pd.read_csv(baseUrl+'test.csv') house_df.head() # 刪除無關變量 house_df=house_df.drop(['saleTime','year','repairYear','latitude','longitude','buildingSize'],axis=1) test_df=test_df.drop(['saleTime','year','repairYear','latitude','longitude','buildingSize'],axis=1) # 模型創建 X_price=house_df.drop(['price'],axis=1) # X_price.head() Y_price=house_df['price'] Y_price.head() LR_reg=LinearRegression() LR_reg.fit(X_price, Y_price) Y_pred = LR_reg.predict(test_df) LR_reg.score(X_price, Y_price) # 能夠選擇進行特徵縮放 #new_house=house_df.drop(['price'],axis=1) #from sklearn.preprocessing import MinMaxScaler #minmax_scaler=MinMaxScaler().fit(new_house) #進行內部擬合,內部參數會發生變化 #scaler_housing=pd.DataFrame(minmax_scaler.transform(new_house),columns=new_house.columns) #mm=MinMaxScaler() #mm.fit(test_df) #scaler_t=mm.transform(test_df) #scaler_t=pd.DataFrame(scaler_t,columns=test_df.columns)