Python數據分析——California房價的線性梯度提升迴歸模型學習筆記

目 錄

1 需求分析

2 數據探索

3 數據預處理

4 構建模型與評估


1 需求分析

這是個輸出模型,模型的輸出是某個地區的房價。顯而易見是監督學習的任務。另外,因爲這是個預測準確值的任務,所以它也是個迴歸任務。

1)監督學習(Supervised learning):根據已有的數據集,知道輸入和輸出結果之間的關係。根據這種已知的關係,訓練得到一個最優的模型。也就是說,在監督學習中訓練數據既有特徵(feature)又有標籤(label),通過訓練,讓機器可以自己找到特徵和標籤之間的聯繫,在面對只有特徵沒有標籤的數據時,可以判斷出標籤。通俗一點,可以把機器學習理解爲我們教機器如何做事情。迴歸(Regression)、分類(Classification)  

2)無監督學習(Unsupervised Learning ),我們不知道數據集中數據、特徵之間的關係,而是要根據聚類或一定的模型得到數據之間的關係。可以這麼說,比起監督學習,無監督學習更像是自學,讓機器學會自己做事情,是沒有標籤(label)的。

2 數據探索

2.1 初步探索

1) 導入數據

import pandas as pd

def LoadData(file):
    return pd.read_csv('D:/Project/Anaconda/Lib/site-packages/sklearn/datasets/data/'+file,encoding='gbk')
data = LoadData('California.csv')
data.head(5)

查看導入的結果,每個數據有十個特徵,分別是經度,緯度,房屋年齡中位數,房間總數,臥室總數,地區人口數,家庭數量,收入中位數,房價中位數以及一個位置屬性(是否接近灣區)。

 

 2) 使用Info()和describe()函數查看數據屬性

data.info()

info()函數
功能: 給出樣本數據的相關信息概覽 :行數,列數,列索引,列非空值個數,列類型,內存佔用
使用格式:DataFrame.info(verbose=None, memory_usage=True, null_counts=True) 
參數解釋:

verbose:True or False,字面意思是冗長的,也就說如何DataFrame有很多列,是否顯示所有列的信息;如果爲否,那麼會省略一部分;
memory_usage:True or False,默認爲True,是否查看DataFrame的內存使用情況;
null_counts:True or False,默認爲True,是否統計NaN值的個數 

運行結果如圖:

 可以看到有的屬性有缺失值,有的屬性類型不爲數值型。

data.describe()

功能:直接給出樣本數據的一些基本的統計量,包括均值,標準差,最大值,最小值,分位數等。
使用格式:data.describe()
可以傳遞一些參數,如percentiles = [0.2,0.4,0.6,0.8]就是指定0.2,0.4,0.6,0.8分位數,而不是默認的0.25,0.5,0.75分位數

 

 拿房屋年齡中位數舉例,它的25%顯示是18,表示有25%的地區房子年齡少於18年,50%的地區房子年齡少於29年,75%的房子年齡少於37年。這三個屬性有助於我們瞭解數據的基本分佈情況。

2.2 數據集分割 

from sklearn.model_selection import train_test_split

house_train,house_test = train_test_split(data, test_size=0.2, random_state=24)
print("train :",len(house_train)," test:",len(house_test) )

train : 16512  test: 4128

功能是從樣本中隨機的按比例選取traindata和testdata,形式爲:
X_train,X_test, y_train, y_test = cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

參數解釋:
 train_data:所要劃分的樣本特徵集
 train_target:所要劃分的樣本結果 
 test_size:樣本佔比,如果是整數的話就是樣本的數量 
 random_state:是隨機數的種子。
隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。
比如你每次都填1,其他參數一樣的情況下你得到的隨機數組是一樣的。但填0或不填,每次都會不一樣。 
隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則: 
種子不同,產生不同的隨機數;種子相同,即使實例不同也產生相同的隨機數。

 2.3 相關性探索

housing = house_train.copy()
corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

 運行結果如下,這是計算每個屬性之間的標準相關係數(也稱作皮爾遜相關係數),查看每個屬性和median_house_value的相關係數,數值在[-1,1]之間。 接近1時,說明兩個特徵有很明顯的正相關關係;相反則是有很明顯的負相關關係;如果是0,則說明沒有相關關係。

再看一下熱力圖:

 

heatmap熱度圖,拿到一批數據一般會求特徵之間的相關係數,可以用padas直接求出來相關係數,放到heatmap,可以很清楚的看到兩個特徵的相關程度,這是一個固定的數據思維。

3 數據預處理

數據預處理是構建特徵工程的基本環境,並且是提高算法精確度的有效手段。數據預處理需要根據數據本身的特性進行,不同的格式有不同的處理要求,比如無效的要剔除,缺失值要回填和冗餘維度的選擇等。

3.1 SKLearn進行數據預處理介紹

1)無量綱化

在機器學習算法實踐中,我們往往有着將不同規格的數據轉換到同一規格,或不同分佈的數據轉換到某個特定分佈的需求,這種需求統稱爲將數據無量綱化。數據的無量綱化可以是線性的,也可以是非線性的。

2)缺失值處理

數據處理過程中,不可避免的會出現很多空值,這時就需要我們通過業務經驗選擇性的進行數值填充,儘量保證模型的準確性。

 sklearn.impute.SimpleImputer(missing_values=nan,strategy=‘mean’, fill_value=None, verbose=0, copy=True)

參數介紹:
1.missing_values:告訴SimpleImputer,數據中的缺失值長什麼樣,默認空值np.nan
2.strategy:我們填補缺失值的策略,默認均值。
輸入“mean”使用均值填補(僅對數值型特徵可用)
輸入“median"用中值填補(僅對數值型特徵可用)
輸入"most_frequent”用衆數填補(對數值型和字符型特徵都可用)
輸入“constant"表示請參考參數“fill_value"中的值(對數值型和字符型特徵都可用)
3.fill_value:當參數startegy爲”constant"的時候可用,可輸入字符串或數字表示要填充的值,常用0。
4.copy:默認爲True,將創建特徵矩陣的副本,反之則會將缺失值填補到原本的特徵矩陣中去。

 3)分類型特徵處理

由於很多的機器學習算法是計算數值型數據的,但現實情況下特徵數據中包含很多文本數據,又不能忽略掉。在這種情況下,爲了讓數據適應算法和庫,我們必須將數據進行編碼,即是說,將文字型數據轉換爲數值型。

preprocessing.LabelEncoder 標籤專用,能夠將分類轉換爲分類數值,是對不連續的數字或者文本進行
編號(連續的會是同一個編號)。
preprocessing.OrdinalEncoder 特徵專用,能夠將分類特徵轉換爲分類數值,其主要處理有序變量。
preprocessing.OneHotEncoder 獨熱編碼,創建啞變量,其處理名義變量

舉個例子: 

自然狀態碼爲:000,001,010,011,100,101
獨熱編碼爲:000001,000010,000100,001000,010000,100000
可以這樣理解,對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵
(如成績這個特徵有好,中,差變成one-hot就是011, 010, 001)。並且,這些特徵互斥,每次只有一個激活;而且,可以表示原始數據的大小。)

4)連續型特徵處理

sklearn.preprocessing.Binarizer類
根據閾值將數據二值化(將特徵值設置爲0或1),用於處理連續型變量。

preprocessing.KBinsDiscretizer
這是將連續型變量劃分爲分類變量的類,能夠將連續型變量排序後按順序分箱後編碼。

3.2 本項目中的實現

 

from  sklearn.pipeline  import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder


#拆分數據,獲得特徵矩陣H以及只含有median_house_value作爲真實的label值,y值 
housing=house_train.drop("median_house_value",axis=1)
housing_labels=house_train["median_house_value"].copy()
housing_copy = housing.drop("ocean_proximity",axis=1)#去掉干擾值

num_attribs = list(housing_copy)
cat_attribs = ['ocean_proximity']

num_type_pipeline=Pipeline([
    ('simputer',SimpleImputer(strategy="median")),     #用中位數填充
    ('std_scaler',StandardScaler())
    
])

full_pipeline = ColumnTransformer([
        ("num", num_type_pipeline, num_attribs),
        ("cat", OneHotEncoder(), cat_attribs),        #使用獨熱編碼
    ])

housing_prepared = full_pipeline.fit_transform(housing)#x值
housing_prepared.shape

輸出:(16512, 13)

介紹這個流水線式的處理思想:

在Sklearn當中有三大模型:Transformer 轉換器、Estimator 估計器、Pipeline 管道

  • Transformer轉換器 (StandardScaler,MinMaxScaler)。
  • Estimator 估計器(LinearRegression、LogisticRegression、LASSO、Ridge),所有的機器學習算法模型,都被稱爲估計器。
  • Pipeline 管道:將Transformer、Estimator 組合起來成爲一個大模型。輸入→□→□→□→■→ 輸出                                     □:Transformer ; ■:Estimator ;Transformer放在管道前幾個模型中,而Estimator 只能放到管道的最後一個模型中。

pipeline用於對特徵處理、數據轉換、迴歸或分類等多個步驟進行串聯,功能是實現多個estimator的串行處理。

featureunion用於對特徵的處理,功能是實現多個transformer的並行處理,最終輸出它們的結果的並集。每個transformer的輸入都是全部的原始特徵。

ColumnTransformer用於對特徵的處理,功能是針對不同的列做不同的處理,最終輸出各自結果的合集。與featureunion不同的是,它各個transformer的輸入是原始特徵的一部分。

4 構建模型與評估

  • 根據分析過程中輸出和輸入的關係,又可以分類成迴歸分析、聚類分析、分類和關聯規則分析等。
  • 根據輸入的特徵,可以分爲監督學習、無監督學習和半監督學習等。
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error,explained_variance_score,mean_absolute_error,median_absolute_error,r2_score

#預測模型
GBR_house = GradientBoostingRegressor().fit(housing_prepared,housing_labels)
GBR_housing_predictions = GBR_house.predict(housing_prepared)

#評價模型
GBR_mse = mean_squared_error(housing_labels,GBR_housing_predictions)
GBR_ab = mean_absolute_error(housing_labels,GBR_housing_predictions)
GBR_va = explained_variance_score(housing_labels,GBR_housing_predictions)
GBR_mab = median_absolute_error(housing_labels,GBR_housing_predictions)
GBR_r2 = r2_score(housing_labels,GBR_housing_predictions)
GBR_rmse = np.sqrt(GBR_mse)

#輸出評價結果
print('GBR迴歸模型的平均值絕對值爲:',GBR_ab)
print('GBR迴歸模型的中值絕對值爲:',GBR_mab)
print('GBR迴歸模型的可解釋方差值爲:',GBR_va)
print('GBR迴歸的決定係數爲:',GBR_r2)
print ('GBR迴歸模型的標準差爲:',GBR_rmse)

 

評價結果輸出:

GBR迴歸模型的平均值絕對值爲: 37309.044287613804
GBR迴歸模型的中值絕對值爲: 26495.989202691184
GBR迴歸模型的可解釋方差值爲: 0.7861164571729515
GBR迴歸的決定係數爲: 0.7861164571729515
GBR迴歸模型的標準差爲: 53398.51873035388

 

參考鏈接:sklearn.ensemble.GradientBoostingRegressor官方文檔:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor

GBR模型解釋:https://blog.csdn.net/xlsj228/article/details/105122816

                        https://blog.csdn.net/zhsworld/article/details/102951061

 

評估指標解釋:
    mean_squared_error:均方差(Mean squared error, MSE),
    該指標計算的是擬合數據和原始數據對應樣本點的誤差的平方和的均值,其值越小說明擬合效果越好。

     mean_absolute_error:平均絕對誤差(Mean Absolute Error, MAE),
    用於評估預測結果和真實數據集的接近程度的程度,其值越小說明擬合效果越好。

    explained_variance_score:解釋迴歸模型的方差得分,其值取值範圍是[0,1],
    越接近於1說明自變量越能解釋因變量的方差變化,值越小則說明效果越差。

    r2_score:判定係數,其含義是也是解釋迴歸模型的方差得分,其值取值範圍是[0,1],
    越接近於1說明自變量越能解釋因變量的方差變化,值越小則說明效果越差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章