1.什么是機器學習?
像豆瓣、淘寶、QQ音樂這些推薦系統,背后的秘密武器正是機器學習
機器學習是:用機器學習算法來建立模型,並利用規律和模型對未知數據進行預測。
- 監督學習 supervised learning;
- 非監督學習 unsupervised learning;
- 半監督學習 semi-supervised learning;
- 強化學習 reinforcement learning;
- 遺傳算法 genetic algorithm
2.機器學習步驟

機器學習的基本步驟 1. 提出問題: 明確是分類問題還是回歸問題 2. 理解數據: 2.1 采集數據 sklearn.datasets中有練習數據(數據要有代表性,數據量要合適) 2.2 導入數據 pd.csv... 2.3 查看數據集信息 data.shape查看數據形狀;.shape[0]查看行數;.shape[1]查看列數 df.head()查看前幾行; df.describe()查看數值數據的描述統計信息; http://df.info()根據行數查看數據是否有缺失值,數據類型是否合適 了解各個字段的含義,目標和特征分別是哪個字段;也可通過可視化了解數據的分布 3. 數據清洗: 3.1 數據預處理:缺失值處理、重復值處理、數據類型的轉換、字符串數據的規整 缺失值處理(標簽數據無需填充缺失): 數值類型,用平均值取代:data[A].fillna(data[A].mean()) 分類數據,用最常見的類別取代:data[A].value_counts();data[A].fillna("前面得到的最常見的類別");data[A].fillna("U")缺失比較多時,填充代表未知的字符串 使用模型預測缺失值,例如:K-NN 數據歸一化/標准化: 模型具有伸縮可變性,如SVM,最好進行標准化,避免模型參數受極值影響;伸縮不變模型,如邏輯回歸,最好也進行標准化,可以加快訓練速度 歸一化/標准化常見兩種方法:min-max,化為[0,1]:(x-min(x))/(max(x)-min(x))/preprocessing.MinMaxScaler;適合分別在有限范圍內的數據,數值較集中,但min/max不穩定會影響結果 Z-core,化為均值為0,方差為1:(x-mean(x))/std(x)/sklearn.preprocessing.scale(),適合最大/最小值未知,或者有超出取值范圍的離散值 3.2 特征提取(特征工程.1) 數值型數據處理:一般可直接使用,或通過運算轉化為新的特征 家庭人數可統計分類:df.家庭人數=df.A+df.B+1(自己);df.小家庭=df.家庭人數.map(lambda匿名函數-lambda s : 1 if 2 <= s <= 4 else 0) 分類型數據處理: 兩個類別:性別數據分別填充為1、0:df.A=df.A.map({"male":1;"female":0}) 超兩個類別:one-hot編碼,data'=pd.get_dummies(df.A , prefix='前綴' );pd.concat([data,data'],axis=1) 字符串型-姓名:每一個姓名中都包含了稱謂,利用split函數將稱謂提取出來;.strip用於移除空格;將稱謂進行歸類,定義對應字典,利用map函數替換;進行one_hot編碼 字符串型-客艙號:a[n]可以取到字符串數據 第“n”個字符;提取之后進行one_hot編碼 時間序列數據,一段時間定期收集的數據-可轉成年月日 3.3 特征選擇(特征工程.2) 計算各個特征和標簽的相關性:df '=pd.corr() 查看標簽對應的相關系數:df '.標簽.sort_values(ascending =False) 根據相關系數的大小選擇特征列做為模型輸入 4. 構建模型: 4.1 建立訓練數據集和測試數據集 選取訓練數據和測試數據的特征和標簽:.loc選取特征列和標簽列;train_test_spilt 划分,通常80%為訓練數據集 .shape查看划分結果 4.2. 選擇機器學習算法: 導入算法 邏輯回歸(logisic regression) 隨機森林(Random Forests Model) 支持向量機(Support Vector Machines) Gradient Boosting Classifier K-nearest neighbors Gaussian Naive Bayes 數據降維:PCA,Isomap 數據分類:SVC,K-Means 線性回歸:LinearRegression 創建模型 model=LinearRegression() 訓練模型 model.fit(train_X , train_y ) 5. 評估模型 model.score(test_X , test_y ),不同的模型指標不一樣,分類模型評估准確率 metrics.confusion_matrix:混淆矩陣 homogeneity_score:同質性,每個群集只包含單個類的成員;[0,1],1表示完全同質。 completeness_score:完整性,給定類的所有成員都分配給同一個群集。[0,1],1表示完全完整。 v_measure_score:同質性和完整性的調和平均值 adjusted_mutual_info_score:蘭德系數ARI,取值范圍[-1,1],值越大,表示與聚類結果與真實越吻合,體現的是兩個數據分布的吻合程度 adjusted_mutual_info_score:互信息AMI,取值[-1,1],值越大,與真實情況越吻合。 fowlkes_mallows_score:精確率和召回率的幾何平均值,[0,1],越大,越相似。 silhouette_score:輪廓系數,[-1,1]同類別越近,不同類別越遠,系數越大。 calinski_harabaz_score:類內部協方差越小,類之間協方差越大,改數值越大,聚類效果越好。 6. 方案實施 model.predict(pred_X),得到預測結果 7.報告撰寫
3、協方差和相關系數
確定自變量和因變量之間的相關性
一、簡單線性回歸
回歸分析(Regression Analysis)
研究自變量與因變量之間關系形式的分析方法,它主要是通過建立因變量y與影響它的自變量 x_i(i=1,2,3… …)之間的回歸模型,來預測因變量y的發展趨向。
回歸分析的分類:
線性回歸分析:簡單線性回歸、多重線性回歸
非線性回歸分析:邏輯回歸、神經網絡
回歸分析的步驟:
1、根據預測目標,確定自變量和因變量
2、繪制散點圖,確定回歸模型類型
3、估計模型參數,建立回歸模型
4、對回歸模型進行檢驗
5、利用回歸模型進行預測
簡單線性回歸模型
(1)第一步 確定變量
確定因變量和自變量很簡單,誰是已知,誰就是自變量,誰是未知,就就是因變量,因此,推廣費是自變量,銷售額是因變量;
import numpy from pandas import read_csv from matplotlib import pyplot as plt from sklearn.linear_model import LinearRegression data = read_csv( )
(2)第二步 確定類型
繪制散點圖,確定回歸模型類型
根據前面的數據,畫出自變量與因變量的散點圖,看看是否可以建立回歸方程,
在簡單線性回歸分析中,我們只需要確定自變量與因變量的相關度為強相關性,即可確定可以建立簡單線性回歸方程,
求解出推廣費與銷售額之間的相關系數是0.94,也就是具有強相關性,
從散點圖中也可以看出,二者是有明顯的線性相關的,也就是推廣費越大,銷售額也就越大
#畫出散點圖,求x和y的相關系數 plt.scatter(data.活動推廣費,data.銷售額) data.corr()
協方差:
如果有X,Y兩個變量,每個時刻的“X值與其均值之差”乘以“Y值與其均值之差”得到一個乘積再對這每時刻的乘積求和並求出均值(期望)
相關系數:
1)Pearson相關系數是在原始數據的方差和協方差基礎上計算得到,所以對離群值比較敏感,它度量的是線性相關。因此,即使pearson相關系數為0,也只能說明變量之間不存在線性相關,但仍有可能存在曲線相關。
就是用X、Y的協方差除以X的標准差和Y的標准差
(3)第三步 建立模型
估計模型參數,建立回歸模型
要建立回歸模型,就要先估計出回歸模型的參數A和B,那么如何得到最佳的A和B,使得盡可能多的數據點落在或者更加靠近這條擬合出來的直線上呢?
最小二乘法
#估計模型參數,建立回歸模型 ''' (1) 首先導入簡單線性回歸的求解類LinearRegression (2) 然后使用該類進行建模,得到lrModel的模型變量 ''' lrModel = LinearRegression() #(3) 接着,我們把自變量和因變量選擇出來 x = data[['活動推廣費']] y = data[['銷售額']] #模型訓練 ''' 調用模型的fit方法,對模型進行訓練 這個訓練過程就是參數求解的過程 並對模型進行擬合 ''' lrModel.fit(x,y)
(4)第四步 模型檢驗
對回歸模型進行檢驗
決定系數R平方
用來評估模型的精確度,即回歸線的擬合程度;
R平方越高,回歸模型越准確;

#對回歸模型進行檢驗 lrModel.score(x,y)
解釋:判定系數等於相關系數R的平方用於表示擬合得到的模型能解釋因變量變化的百分比,R平方越接近於1,表示回歸模型擬合效果越好
(5)第五步 模型預測
- 調用模型的predict方法,這個就是使用sklearn進行簡單線性回歸的求解過程;
用Python實現簡單線性回歸實例
一、機器學習的步驟:
二、提出問題
學習時間和成績的關系
(明確是分類問題還是回歸問題)
三、理解數據
3.1 獲取數據源 本次數據源為自定義數據
data={ '學習時間':[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] }
3.2查看數據集信息
data.info()
data.shape查看數據形狀;
.shape[0]查看行數;.shape[1]查看列數 df.head()查看前幾行;
df.describe()查看數值數據的描述統計信息;
data_order=OrderedDict(data)
df = pd.DataFrame(data_order)
df.info()
df.head()
自定義數據集共有兩個字段,學習時間和分數,共20條數據
四、清洗數據
數據自定義且格式正確
五、構建模型
#5.1繪制散點圖,確定回歸模型類型 # 提取特征值 exam_x = df.loc[:,'學習時間'] exam_y = df.loc[:,'分數'] plt.scatter(exam_x,exam_y,color='r',label='exam_score') # 添加坐標標簽 plt.xlabel('hours') plt.ylabel('score') #顯示圖像 plt.show()

# 從以上散點圖可以初步判斷,該數據集特征和標簽的關系符合正線性回歸模型。
# 判斷學習時間和成績的相關性 df.corr()

求解出學習時間與成績之間的相關系數是0.924,也就是具有強相關性,從散點圖中也可以看出,二者是有明顯的線性相關的,也就是學習時間越長,分數越高
5.2建立訓練數據集和測試數據集 分割數據,將數據隨機分成訓練數據(80%)和測試數據(20%):
train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和
測試數據(test)
第一個參數:所要划分的樣本特征
第2個參數:所要划分的樣本標簽
train_size:訓練數據占比,如果是整數的話就是樣本的數量,這里是80%
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 = 0.8) #輸出數據大小 print('原始數據特征:',exam_x.shape , ',訓練數據特征:', x_train.shape , ',測試數據特征:',x_test.shape ) print('原始數據標簽:',exam_y.shape , '訓練數據標簽:', y_train.shape , '測試數據標簽:' ,y_test.shape)

5.3選擇機器學習算法:
# 導入算法 邏輯回歸(logisic regression) 隨機森林(Random Forests Model) 支持向量機(Support Vector Machines) Gradient Boosting Classifier K-nearest neighbors Gaussian Naive Bayes 數據降維:PCA,Isomap 數據分類:SVC,K-Means 線性回歸:LinearRegression 創建模型 model=LinearRegression() 訓練模型 model.fit(train_X , train_y )
本分析案例屬於強線性相關,選擇線性回歸算法進行 訓練模型
# 第1步:導入線性回歸 from sklearn.linear_model import LinearRegression # 第2步:創建模型:線性回歸 model = LinearRegression() # 第3步:訓練模型 model.fit(x_train , y_train)

上面報錯的內容翻譯過來就是:
如果你輸入的數據只有1個特征,需要用array.reshape(-1, 1)來改變數組的形狀
#將訓練數據特征轉換成二維數組XX行*1列 x_train=x_train.values.reshape(-1,1) #將測試數據特征轉換成二維數組行數*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)
六、模型評估
6.1、求出線性回歸方程
a=model.intercept_ #截距 b=model.coef_ #回歸系數 print('最佳擬合線:截距a=',a,',回歸系數b=',b)

6.2繪圖
# 繪圖 import matplotlib.pyplot as plt # 訓練數據散點圖 plt.scatter(x_train, y_train, color='blue', label="train data") # 測試數據散點圖 plt.scatter(x_test,y_test,color='r',label='test 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()
6.3評估模型:決定系數R平方
model.score(x_test , y_test)
R平方=0時,x變量與y變量無關 R平方=1時,x變量可預測y變量,且沒有誤差 R平方越大(0到1),回歸模型越精確
七、總結
研究問題:學習時間和成績的關系?
數據來源:自定義數據源共20條數據
特征值和標簽分別為:學習時間和成績
(特征是做出某個判斷的證據,標簽是結論)
相關系數是0.924,也就是具有強相關性,選擇線性回歸算法進行 訓練模型
評估模型:決定系數R平方為0.93,表示回歸模型精准,擬合效果好
結論:學習時間與成績是強相關性也就是學習時間越長,分數越高