国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

入門Python數據分析最好的實戰項目(二)

Flands / 2460人閱讀

摘要:作者微信公眾號數據科學知乎數據分析師上一篇和大家分享了一個入門數據分析的一個小項目北京二手房房價分析,鏈接如下入門數據分析最好的實戰項目一文章在發布之后看到有不少感興趣的朋友給我點了贊,感謝大家的支持了。

作者:xiaoyu

微信公眾號:Python數據科學

知乎:python數據分析師


上一篇和大家分享了一個入門數據分析的一個小項目 北京二手房房價分析,鏈接如下:

入門Python數據分析最好的實戰項目(一)

文章在sf發布之后看到有不少感興趣的朋友給我點了贊,感謝大家的支持了。

本篇將繼續上一篇數據分析之后進行數據挖掘建模預測,這兩部分構成了一個簡單的完整項目。結合兩篇文章通過數據分析和挖掘的方法可以達到二手房屋價格預測的效果。

下面從特征工程開始講述。

特征工程

特征工程包括的內容很多,有特征清洗,預處理,監控等,而預處理根據單一特征或多特征又分很多種方法,如歸一化,降維,特征選擇,特征篩選等等。這么多的方法,為的是什么呢?其目的是讓這些特征更友好的作為模型的輸入,處理數據的好壞會嚴重的影響模型性能,而好的特征工程有的時候甚至比建模調參更重要。

下面是繼上一次分析之后對數據進行的特征工程,博主將一個一個幫大家解讀。

"""
特征工程
"""
# 移除結構類型異常值和房屋大小異常值
df = df[(df["Layout"]!="疊拼別墅")&(df["Size"]<1000)]

# 去掉錯誤數據“南北”,因為爬蟲過程中一些信息位置為空,導致“Direction”的特征出現在這里,需要清除或替換
df["Renovation"] = df.loc[(df["Renovation"] != "南北"), "Renovation"]

# 由于存在個別類型錯誤,如簡裝和精裝,特征值錯位,故需要移除
df["Elevator"] = df.loc[(df["Elevator"] == "有電梯")|(df["Elevator"] == "無電梯"), "Elevator"]

# 填補Elevator缺失值
df.loc[(df["Floor"]>6)&(df["Elevator"].isnull()), "Elevator"] = "有電梯"
df.loc[(df["Floor"]<=6)&(df["Elevator"].isnull()), "Elevator"] = "無電梯"

# 只考慮“室”和“廳”,將其它少數“房間”和“衛”移除
df = df.loc[df["Layout"].str.extract("^d(.*?)d.*?") == "室"]

# 提取“室”和“廳”創建新特征
df["Layout_room_num"] = df["Layout"].str.extract("(^d).*", expand=False).astype("int64")
df["Layout_hall_num"] = df["Layout"].str.extract("^d.*?(d).*", expand=False).astype("int64")

# 按中位數對“Year”特征進行分箱
df["Year"] = pd.qcut(df["Year"],8).astype("object")

# 對“Direction”特征
d_list_one = ["東","西","南","北"]
d_list_two = ["東西","東南","東北","西南","西北","南北"]
d_list_three = ["東西南","東西北","東南北","西南北"]
d_list_four = ["東西南北"]    
df["Direction"] = df["Direction"].apply(direct_func)
df = df.loc[(df["Direction"]!="no")&(df["Direction"]!="nan")]

# 根據已有特征創建新特征
df["Layout_total_num"] = df["Layout_room_num"] + df["Layout_hall_num"]
df["Size_room_ratio"] = df["Size"]/df["Layout_total_num"]

# 刪除無用特征
df = df.drop(["Layout","PerPrice","Garden"],axis=1)

# 對于object特征進行onehot編碼
df,df_cat = one_hot_encoder(df)

由于一些清洗處理在上一篇文章已經提到,博主從17行代碼開始。

Layout

先來看看沒經處理的Layout特征值是什么樣的。

df["Layout"].value_counts()

大家也都看到了,特征值并不是像想象中的那么理想。有兩種格式的數據,一種是"xx室xx廳",另一種是"xx房間xx衛",但是絕大多數都是xx室xx廳的數據。而對于像"11房間3衛"或者"5房間0衛"這些的Layout明顯不是民住的二手房(不在我們的考慮范圍之內),因此最后決定將所有"xx房間xx衛"格式的數據都移除掉,只保留"xx室xx廳"的數據。

Layout特征的處理如下:

第2行的意思是只保留"xx室xx廳"數據,但是保留這種格式的數據也是不能作為模型的輸入的,我們不如干脆將"室"和"廳"都提取出來,多帶帶作為兩個新特征(如第5和6行),這樣效果可能更好。

具體的用法就是使用 str.extract() 方法,里面寫的是正則表達式。

# 只考慮“室”和“廳”,將其它少數“房間”和“衛”移除
df = df.loc[df["Layout"].str.extract("^d(.*?)d.*?") == "室"]

# 提取“室”和“廳”創建新特征
df["Layout_room_num"] = df["Layout"].str.extract("(^d).*", expand=False).astype("int64")
df["Layout_hall_num"] = df["Layout"].str.extract("^d.*?(d).*", expand=False).astype("int64")
Year

我們還有一個 Year 特征,為建房的年限時間。年限種類很多,分布在1950和2018之間,如果每個不同的 Year 值都作為特征值,我們并不能找出 Year 對 Price 有什么影響,因為年限劃分的太細了。因此,我們只有將連續數值型特征 Year 離散化,做分箱處理

如何分箱還要看實際業務需求,博主為了方便并沒有手動分箱,而使用了pandas的 qcut 采用中位數進行分割,分割數為8等份。

# 按中位數對“Year”特征進行分箱
df["Year"] = pd.qcut(df["Year"],8).astype("object")

這是將 Year 進行分箱的結果:

Direction

這個特征沒處理之前更亂,原以為是爬蟲的問題,但是親自到鏈家看過,朝向確實是這樣的。

如上所見,像"西南西北北"或者"東東南南"這樣的朝向是不符合常識的(反正我是理解不了)。因此,我們需要將這些凌亂的數據進行處理,具體實現方式是博主自己寫了一個函數 direct_func,主要思想就是將各種重復但順序不一樣的特征值合并,比如"西南北""南西北",并將不合理的一些值移除,如"西南西北北"等。

然后通過 apply() 方法將 Direction 數據格式轉換,代碼如下:

# 對“Direction”特征
d_list_one = ["東","西","南","北"]
d_list_two = ["東西","東南","東北","西南","西北","南北"]
d_list_three = ["東西南","東西北","東南北","西南北"]
d_list_four = ["東西南北"]    
df["Direction"] = df["Direction"].apply(direct_func)
df = df.loc[(df["Direction"]!="no")&(df["Direction"]!="nan")]

處理完結果如下,所有的內容相同而順序不同的朝向都合并了,異常朝向也被移除了。

創建新特征

有時候僅靠已有的一些特征是不夠的,需要根據對業務的理解,定義一些的新特征,然后嘗試這些新特征對模型的影響,在實戰中會經常使用這種方法。

這里嘗試將"室"與"廳"的數量相加作為一個總數量特征,然后將房屋大小Size與總數量的比值作為一個新特征,可理解為 "每個房間的平均面積大小"。當然,新特征不是固定的,可根據自己的理解來靈活的定義。

# 根據已有特征創建新特征
df["Layout_total_num"] = df["Layout_room_num"] + df["Layout_hall_num"]
df["Size_room_ratio"] = df["Size"]/df["Layout_total_num"]

# 刪除無用特征
df = df.drop(["Layout","PerPrice","Garden"],axis=1)

最后刪除舊的特征 Layout,PerPrice,Garden。

One-hot coding

這部分是 One-hot 獨熱編碼,因為像 Region,Year(離散分箱后),Direction,Renovation,Elevator等特征都是定類的非數值型類型,而作為模型的輸入我們需要將這些非數值量化。

在沒有一定順序(定序類型)的情況下,使用獨熱編碼處理定類數據是非常常用的做法,在pandas中非常簡單,就是使用 get_dummies() 方法,而對于像Size這樣的定比數據則不使用獨熱,博主這里用了一個自己封裝的函數實現了定類數據的自動量化處理。

對于定類,定序,定距,定比這四個非常重要的數據類型相信加入知識星球的伙伴都非常熟悉了,想要了解的同學可以掃描最后二維碼查看。
# 對于object特征進行onehot編碼
df,df_cat = one_hot_encoder(df)

以上的特征工程就完成了。

特征相關性

下面使用 seabornheatmap 方法對特征相關性進行可視化。

# data_corr 
colormap = plt.cm.RdBu
plt.figure(figsize=(20,20))
# plt.title("Pearson Correlation of Features", y=1.05, size=15)
sns.heatmap(df.corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor="white", annot=True)

顏色偏紅或者偏藍都說明相關系數較大,即兩個特征對于目標變量的影響程度相似,即存在嚴重的重復信息,會造成過擬合現象。因此,通過特征相關性分析,我們可以找出哪些特征有嚴重的重疊信息,然后擇優選擇。

數據建模預測

為了方便理解,博主在建模上做了一些精簡,模型策略方法如下:

使用Cart決策樹的回歸模型對二手房房價進行分析預測

使用交叉驗證方法充分利用數據集進行訓練,避免數據劃分不均勻的影響。

使用GridSearchCV方法優化模型參數

使用R2評分方法對模型預測評分

上面的建模方法比較簡單,旨在讓大家了解建模分析的過程。隨著逐漸的深入了解,博主會介紹更多實戰內容。

數據劃分
# 轉換訓練測試集格式為數組
features = np.array(features)
prices = np.array(prices)

# 導入sklearn進行訓練測試集劃分
from sklearn.model_selection import train_test_split
features_train, features_test, prices_train, prices_test = train_test_split(features, prices, test_size=0.2, random_state=0)

將以上數據劃分為訓練集和測試集,訓練集用于建立模型,測試集用于測試模型預測準確率。使用sklearn的 model_selection 實現以上劃分功能。

建立模型
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

# 利用GridSearchCV計算最優解
def fit_model(X, y):
    """ 基于輸入數據 [X,y],利于網格搜索找到最優的決策樹模型"""
    
    cross_validator = KFold(10, shuffle=True)
    regressor = DecisionTreeRegressor()
    
    params = {"max_depth":[1,2,3,4,5,6,7,8,9,10]}
    scoring_fnc = make_scorer(performance_metric)
    grid = GridSearchCV(estimator = regressor, param_grid = params, scoring = scoring_fnc, cv = cross_validator)

    # 基于輸入數據 [X,y],進行網格搜索
    grid = grid.fit(X, y)
#     print pd.DataFrame(grid.cv_results_)
    return grid.best_estimator_

# 計算R2分數
def performance_metric(y_true, y_predict):
    """計算并返回預測值相比于預測值的分數"""
    from sklearn.metrics import r2_score
    score = r2_score(y_true, y_predict)

    return score

使用了 KFold 方法減緩過擬合,GridSearchCV 方法進行最優參數自動搜查,最后使用R2評分來給模型打分。

調參優化模型
import visuals as vs

# 分析模型
vs.ModelLearning(features_train, prices_train)
vs.ModelComplexity(features_train, prices_train)

optimal_reg1 = fit_model(features_train, prices_train)

# 輸出最優模型的 "max_depth" 參數
print("最理想模型的參數 "max_depth" 是 {} 。".format(optimal_reg1.get_params()["max_depth"]))

predicted_value = optimal_reg1.predict(features_test)
r2 = performance_metric(prices_test, predicted_value)

print("最優模型在測試數據上 R^2 分數 {:,.2f}。".format(r2))

由于決策樹容易過擬合的問題,我們這里采取觀察學習曲線的方法查看決策樹深度,并判斷模型是否出現了過擬合現象。以下是觀察到的學習曲線圖形:

通過觀察,最理想模型的參數"max_depth"是10,此種情況下達到了偏差與方差的最優平衡,最后模型在測試數據上的R2分數,也即二手房房價預測的準確率為:0.81

總結

以上一個完整的從數據分析到挖掘的項目就結束了,對于項目而言比較簡單,目的是讓大家了解整個分析的過程。可提升改進的地方非常多,可以有更好更健壯的方案代替,一些改進思考如下:

獲取更多有價值的特征信息,比如學區,附近地鐵,購物中心等

完善特征工程,如進行有效的特征選擇

使用更優秀的模型算法建模或者使用模型融合

完整項目代碼博主分享在了知識星球中,后續博主將不斷分享更多實戰內容,Kaggle競賽項目,以及互聯網金融風險控制項目

關注微信公眾號:Python數據科學,查看更多精彩內容。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41982.html

相關文章

  • Python爬蟲學習路線

    摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...

    liaoyg8023 評論0 收藏0
  • 入門Python數據分析最好實戰項目(一)

    摘要:入門數據分析最好的實戰項目二數據初探首先導入要使用的科學計算包可視化以及機器學習包。檢查缺失值情況發現了數據集一共有條數據,其中特征有明顯的缺失值。 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 目的:本篇給大家介紹一個數據分析的初級項目,目的是通過項目了解如何使用Python進行簡單的數據分析。數據源:博主通過爬蟲采集的鏈家全網北京二手房數據(...

    gitmilk 評論0 收藏0
  • 入門Python數據分析最好實戰項目(一)

    摘要:入門數據分析最好的實戰項目二數據初探首先導入要使用的科學計算包可視化以及機器學習包。檢查缺失值情況發現了數據集一共有條數據,其中特征有明顯的缺失值。 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 目的:本篇給大家介紹一個數據分析的初級項目,目的是通過項目了解如何使用Python進行簡單的數據分析。數據源:博主通過爬蟲采集的鏈家全網北京二手房數據(...

    Cruise_Chan 評論0 收藏0
  • 大學四年學計算機最值得看技術書,要讀就讀最好書,程序員精品書單!

    摘要:其他語言數據結構跟算法一樣是在開始寫代碼的時候用得很少,都有著包裝好的現成東西供你使用,但同樣是面試和崗位上升會用得到,我就不說數據結構對代碼有多少好處,請記住一句話能夠實現個功能和能夠最優地實現個功能,是完全不同級別的要求。 ...

    liangzai_cool 評論0 收藏0

發表評論

0條評論

Flands

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<