一.什么是機器學習?
簡單來說,機器學習是一類算法的總稱,這些算法企圖從大量歷史數據中挖掘出其中隱含的規律,并用于預測或者分類,更具體的說,機器學習可以看作是尋找一個函數,輸入是樣本數據,輸出是期望的結果,所以我們可以總結簡單抽象機器學習的過程:輸入訓練數據->機器學習算法->輸出結果。
二.機器學習步驟?提出問題.
理解數據
數據清洗
構建模型
評估
三.python中的機器學習工具包scikit-learn
SK-learn中文文檔:Introduction · sklearn 中文文檔?sklearn.apachecn.org
四.相關分析
什么是特征?什么是標簽?
比如我們要分析人們對某首歌的喜惡。
特征:特征就是數據的屬性,如一首歌的諸多特征:語言,節奏,風格,時長等等。
標簽:標簽是我們對數據的預測結果,喜惡就是標簽。
什么 是訓練數據?什么是測試數據?
一般做預測分析時,會將數據分為兩大部分。一部分是訓練數據,用于構建模型,一部分是測試數據,用于檢驗模型。有時候模型的構建過程中也需要檢驗模型,輔助模型構建,所以會將訓練數據在分為兩個部分:1)訓練數據;2)驗證數據(Validation Data)。驗證數據用于負責模型的構建。具體的是:訓練數據(Test Data):用于模型構建;驗證數據(Validation Data):可選,用于輔助模型構建,可以重復使用;測試數據(Test Data):用于檢測模型構建,此數據只在模型檢驗時使用,用于評估模型的準確率。絕對不允許用于模型構建過程,否則會導致過渡擬合。
相關分析-簡單線性回歸:
案例引入:探索學生學習時間和考試成績的相關關系,通過學習時間來預測學生的考試分數?
通過我們剛剛對特征和標簽定義,我們可以知道,在該案例中特征和標簽分別對應的是:
特征:學習時間,也就是我們常說的自變量。
標簽:分數,也就是我們常說的因變量。
輸入該部分數據:
import sklearn
from collections import OrderedDict
import pandas as pd
#數據集
examDict={'學習時間':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,
2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
'分數':[10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]}
#將eaxmDict轉成有序字典
examOrderDict = OrderedDict(eaxmDict)
#將上述有序字典導入Dataframe
examDf = pd.DataFrame(examOrderDict)
#查看數據集前5行
examDf.head()
顯然,單純的表格,數據之間的關系還是沒有那么明顯,因此,我們考慮將這些數據放在坐標軸上表示出來:
1)提取特征和標簽
#特征features
exam_X=examDf.loc[:,'學習時間']
#標簽labes
exam_y=examDf.loc[:,'分數']
2)繪制散點圖
#繪制散點圖
import matplotlib.pyplot as plt
#確定散點圖中的X軸和Y軸,scatter是散點圖的意思
plt.scatter(exam_X,exam_y,color='b',label='exam ')
#添加圖標標簽
plt.xlabel('Hours')
plt.ylabel('Score')
#顯示圖像
plt.show()
3)從上面的散點圖,我們可以很本能的猜測,學習時間和分數存在某種正的相關性,學習時間越多,分數越高。
如何統計衡量相關性程度?單純看圖似乎少了什么,我們期望有這樣一個指標:
①能夠表示兩個變量的相關性方向【正線性相關/負線性相關/線性無關】
②能夠表示兩個標量的相關性大小。
那么,考慮如何構建這個指標呢。
觀察上圖中,四個象限點的特點,在
處有一條垂直的虛線,在
處有一條虛線,兩條線將上圖劃分為四個象限,第Ⅰ象限的點對應
,第Ⅱ象限點
,以此類推,因此,我們可以發現,
的值在第Ⅰ象限為正,在第Ⅱ象限為負,在第Ⅲ象限為正,在第Ⅳ象限為負。
在統計學中,我們用來表示兩個變量間線性關系程度的量叫做:協方差(covariance).對于一個容量為n的樣本,其觀測值為
,樣本的協方差定義如下:
如果
的值是正的,那么對
的值影響最大的點必然在第Ⅰ,Ⅲ象限【
同向變動】,因此,
為正表示x與y之間存在正的線性關系,說明,隨著x的增加,y的值也在增加.
如果
的值是負的。對
的值影響最大的點必然在第Ⅱ,Ⅳ象限【
異向變動】,說明 x與y之間存在負的線性關系,隨著x的增加,y的值在減少,最后,若各個點在四個象限中分布均勻,則,
的值接近于0,這表示x與y之間不存在線性關系。
協方差有什么缺點?
協方差看似是個衡量相關性的好的指標,但是在使用協方差作為線性關系強度的度量的時候,主要一個問題就是,協方差的值大小,很大程度上依賴于x,y的計量單位,因此我們考慮使用相關系數來對兩個變量之間的關系進行度量。
其中:
是樣本的相關系數,
是樣本協方差,
是變量x的樣本標準差,
是變量y的樣本標準差。我們知道,樣本標準差
是樣本各單位標準值
與其平均數
離差平方和的算術平均數的平方根。它反映組內個體間的離散程度【且包含計量單位的影響】。我們用協方差除以變量的標準差,就可以剔除計量單位對系數的影響。
相關系數的三個極值:r=1,完全正相關,r=-1,完全負相關,r=0,線性無關。
4)如何在python中求得兩個變量的相關系數:
#相關系數:corr返回結果是一個數據框,存放的是相關系數矩陣
rDf=examDf.corr()
print('相關系數矩陣:')
rDf
相關系數矩陣將很方便看出變量之間的相關關系,有助于我們在面對多個變量在進行特征選擇的時候提高選擇的有效性。
5)回到我們最初的問題,如何通過學習時間來預計學生的成績呢,我們期望在之前的散點圖存在這一一條直線,它穿過了絕大多數的散點,這樣,我們就可以通過這條直線的方程來進行預測了,在回歸模型中,我們把這條線,稱為最佳擬合線。
6)之后的步驟便是要想方設法得到這條線的相關信息了。上圖中公式說我們估計的簡單線性回歸方程,其中我們把
稱為該回歸方程的截距,
為回歸方程的回歸系數,也就是我們熟悉的斜率。如何求和這個的系數
和
呢,我們最常用的方法是最小二乘法,最小二乘法通過使因變量的觀測值
與因變量的預測值
之間的離差平方和達到最小,求得
和
的值。
其中,估計回歸方程的斜率和y軸的截距為:
7)簡單線性回歸方程的python實現:
①提取特征和標簽
#特征features
exam_X=examDf.loc[:,'學習時間']
#標簽labes
exam_y=examDf.loc[:,'分數']
②將數據拆分為訓練數據和測試數據。
訓練數據用來訓練得出回歸方程,測試數據用來檢驗回歸方程的好壞。
'''train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)第1個參數:所要劃分的樣本特征第2個參數:所要劃分的樣本標簽train_size:訓練數據占比,如果是整數的話就是樣本的數量'''
#導入相關包和模塊
from sklearn.model_selection import train_test_split
#建立訓練數據和測試數據
X_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,train_size=.8)
#輸出數據大小
print('原始數據特征:',exam_X.shape,
',訓練數據特征:',X_train.shape,
',測試數據特征:',X_test.shape,)
print('原始數據標簽:',exam_y.shape,
',訓練數據標簽:',y_train.shape,
',測試數據標簽:',y_test.shape,)
③繪出散點圖:
#繪制散點圖
import matplotlib.pyplot as plt
#散點圖
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")
#添加圖標標簽
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()
④訓練模型:
'''運行后會報錯,因為這里輸入的特征只有1個。注意看報錯信息,通過這個例子也學會如何分析報錯信息'''
#第1步:導入線性回歸
from sklearn.linear_model import LinearRegression
# 第2步:創建模型:線性回歸
model = LinearRegression()
#第3步:訓練模型
model.fit(X_train , y_train)如果你輸入的數據只有1個特征,需要用array.reshape(-1, 1)來改變數組的形狀What does -1 mean in numpy reshape??stackoverflow.com-1表示我不知道計算該填什么數字,由python通過array的長度和另一個維度參數推測出來。
我們可以做個小實驗證明一下:
'''理解了reshape后,我們再來看下線性回歸模型sklearn要求輸入的特征必須是二維數組的類型,但是因為我們目前只有1個特征,所以需要用安裝錯誤提示用reshape轉行成二維數組的類型。錯誤提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature'''
#將訓練數據特征轉換成二維數組XX行*1列
X_train=X_train.values.reshape(-1,1)
#將測試數據特征轉換成二維數組XX行*1列
X_test=X_test.values.reshape(-1,1)
#第1步:導入線性回歸
from sklearn.linear_model import LinearRegression
# 第2步:創建模型:線性回歸
model = LinearRegression()
#第3步:訓練模型
model.fit(X_train , y_train)
計算出
和
的值:
'''最佳擬合線:y=bo+ 1X截距intercept:b0回歸系數:b1'''
#截距
b0=model.intercept_
#回歸系數
b1=model.coef_
print('最佳擬合線:截距bo=',b0,',回歸系數b1=',b1)
根據所得系數,繪出圖形:
#繪圖
import matplotlib.pyplot as plt
#訓練數據散點圖
plt.scatter(X_train, y_train, color='blue', label="train data")
#訓練數據的預測值
y_train_pred = model.predict(X_train)
#繪制最佳擬合線
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
#添加圖標標簽
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()
對于我們建立得模型,我們怎么才能知道我們模型的好壞呢?我們知道,最小二乘法只能用來得到某個回歸模型的回歸方程,但是,對于不同回歸方程之間的優劣程度,最小二乘法是沒有辦法進行評判的【可以預見的是,隨著數量集的增加,最小二乘法對應準則的公式的值是越來越大的】,因此我們需要找到一個不受數據數量集多少的影響,對不同回歸方程進行評估:
上圖中,我們可以把SST看作是觀測值在直線
周圍的聚集程度的度量,把SSE看做是觀測值在回歸線
周圍聚集程度的度量,SST=15730,SSE=1530,所以預計的回歸線對樣本的數據的擬合要比直線
好。
數據的總波動【總的平方和】:
總波動中回歸方程不能解釋【誤差平方和】:
總波動中回歸方程能解釋【回歸平方和】:
我們將SSR理解為SST的被解釋部分,把SSE理解為SST的未被解釋的部分。
可以證明:SST=SSR+SSE【化簡再利用求和性質】
如果因變量的每一個值
都剛好落到估計的回歸直線上,那么估計的回歸直線方程將給出一個完全的擬合,這種情況下,對于每一個觀測值,
將都等于0,從而導致SSE=0,所以在完全擬合的情況下,SSR/SST=1,最壞的情形下,預測的回歸直線完全和代表平均數的直線重合,對于每一個,對于每一個觀測值,
將都等于
,從而導致SST=SSE,SSR/SST=0.
由此得到我們的判定系數 :
.
并且由上面的分析, 作為回歸方程的判定系數,
值有以下兩個功能:
①
可以理解為總平方和中能被估計的回歸方程解釋的占比。
②
值越大,說明回歸模型的精度越高。
在之前所學表示的兩個變量之間線性關系強度的相關系數,實際上可以由
推算出:
8)判定系數
的python實現:
#線性回歸的scroe方法得到的是判定系數R平方
#評估模型:決定系數R平方
#model是由我們的訓練數據得到的,評估模型需要用到我們的測試數據。
R_sq = model.score(X_test , y_test)
'''score內部會對第一個參數X_test用擬合曲線自動計算出y預測值,內容是決定系數R平方的計算過程。所以我們只用根據他的要求輸入參數即可。'''
R_sq
判定系數
接近89%,意味著我們模型的準確性較高。
'''下面繪圖的目的是為了:把訓練數據集(圖中藍色的點),和測試數據集(圖中紅色的點)放到一張圖上來比較看'''
#導入繪圖包
import matplotlib.pyplot as plt
'''第1步:繪制訓練數據散點圖'''
plt.scatter(X_train, y_train, color='blue', label="train data")
'''第2步:用訓練數據繪制最佳線'''
#最佳擬合線訓練數據的預測值
y_train_pred = model.predict(X_train)
#繪制最佳擬合線:標簽用的是訓練數據的預測值y_train_pred
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
'''第3步:繪制測試數據的散點圖'''
plt.scatter(X_test, y_test, color='red', label="test data")
#添加圖標標簽
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()
期望是什么:數學期望_百度百科?baike.baidu.com
協方差是什么?:協方差_百度百科?baike.baidu.com
什么是方差?方差_百度百科?baike.baidu.com
為什么樣本方差(sample variance)的分母是 n-1?為什么樣本方差(sample variance)的分母是 n-1??www.zhihu.com