使用Python線性回歸:預測Steam的打折的幅度

2021-01-11 deephub

使用Python線性回歸預測Steam遊戲的打折的幅度

上篇文章我們解決了Steam是否打折的問題,這篇文章我們要解決的是到底打折幅度有多少,這裡我們就不能使用分類模型,而需要使用回歸的模型了。

主要目標

在這個項目中,我將試圖找出什麼樣的因素會影響Steam的折扣率並建立一個線性回歸模型來預測折扣率。

數據

數據將直接從Steam的官方網站上獲取。

我們使用Python編寫抓取程序,使用的庫包括:

「re」— regex」,用於模式查找。

「CSV」— 用於將刮下的數據寫入.CSV文件中,使用pandas進行處理。

「requests」— 向Steam網站發送http/https請求

「BeautifulSoup」—用於查找html元素/標記。

當數據加載到Pandas中時,大概的顯示如下所示:

我們訓練模型的目標是:數據集中預測的目標是「折扣百分比」,DiscountPercentage

數據清洗

採集的原始數據包含許多我們不需要的東西:

一、 免費遊戲,沒有價格,包括演示和即將發布。

二、不打折的遊戲。

三、非數值的數據

我們在把他們清洗的同時,還可以做一些特徵工程。

在後面的章節中,我將介紹在建模和測試時所做的所有特性工程,但是對於基線模型,可以使用以下方式

添加一個「季節」欄,查看遊戲發布的季節:

完成上述過程後,我們現在可以從dataframe中刪除所有基於字符串的列:

這個過程還將把我們的結果從14806個和12個特徵縮小到370個條目和7個特徵。

不好的消息是這意味著由於樣本量較小,該模型很容易出現誤差。

數據分析

分析部分包括三個步驟:

數據探索分析(EDA)特徵工程(FE)建模一般工作流程如下所示:

EDA以找到的特徵-目標關係(通過對圖/熱圖、Lasso 係數等)

根據可用信息,進行特徵工程(數學轉換、裝箱、獲取虛擬條目

使用R方和/或其他指標(RMSE、MAE等)建模和評分

衝洗並重複以上步驟,直到嘗試並用盡所有潛在的特徵工程想法或達到可接受的評分分數(例如R方)。

# Plotting heat map as part of EDA sns.heatmap(df.corr(),cmap="YlGnBu",annot=True) plt.show()

# A compiled function to automatically split data, make and score models. And showing you what's the most relevant features. def RSquare(df, col): X, y = df.drop(col,axis=1), df[col] X, X_test, y, y_test = train_test_split(X, y, test_size=.2, random_state=10) #hold out 20% of the data for final testing #this helps with the way kf will generate indices below X, y = np.array(X), np.array(y) kf = KFold(n_splits=5, shuffle=True, random_state = 50) cv_lm_r2s, cv_lm_reg_r2s, cv_lm_poly_r2s, cv_lasso_r2s = [], [], [], [] #collect the validation results for both models for train_ind, val_ind in kf.split(X,y): X_train, y_train = X[train_ind], y[train_ind] X_val, y_val = X[val_ind], y[val_ind] #simple linear regression lm = LinearRegression() lm_reg = Ridge(alpha=1) lm_poly = LinearRegression() lm.fit(X_train, y_train) cv_lm_r2s.append(lm.score(X_val, y_val)) #ridge with feature scaling scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_val_scaled = scaler.transform(X_val) lm_reg.fit(X_train_scaled, y_train) cv_lm_reg_r2s.append(lm_reg.score(X_val_scaled, y_val)) poly = PolynomialFeatures(degree=2) X_train_poly = poly.fit_transform(X_train) X_val_poly = poly.fit_transform(X_val) lm_poly.fit(X_train_poly, y_train) cv_lm_poly_r2s.append(lm_poly.score(X_val_poly, y_val)) #Lasso std = StandardScaler() std.fit(X_train) X_tr = std.transform(X_train) X_te = std.transform(X_test) X_val_lasso = std.transform(X_val) alphavec = 10**np.linspace(-10,10,1000) lasso_model = LassoCV(alphas = alphavec, cv=5) lasso_model.fit(X_tr, y_train) cv_lasso_r2s.append(lasso_model.score(X_val_lasso, y_val)) test_set_pred = lasso_model.predict(X_te) column = df.drop(col,axis=1) to_print = list(zip(column.columns, lasso_model.coef_)) pp = pprint.PrettyPrinter(indent = 1) rms = sqrt(mean_squared_error(y_test, test_set_pred)) print('Simple regression scores: ', cv_lm_r2s, '\n') print('Ridge scores: ', cv_lm_reg_r2s, '\n') print('Poly scores: ', cv_lm_poly_r2s, '\n') print('Lasso scores: ', cv_lasso_r2s, '\n') print(f'Simple mean cv r^2: {np.mean(cv_lm_r2s):.3f} +- {np.std(cv_lm_r2s):.3f}') print(f'Ridge mean cv r^2: {np.mean(cv_lm_reg_r2s):.3f} +- {np.std(cv_lm_reg_r2s):.3f}') print(f'Poly mean cv r^2: {np.mean(cv_lm_poly_r2s):.3f} +- {np.std(cv_lm_poly_r2s):.3f}', '\n') print('lasso_model.alpha_:', lasso_model.alpha_) print(f'Lasso cv r^2: {r2_score(y_test, test_set_pred):.3f} +- {np.std(cv_lasso_r2s):.3f}', '\n') print(f'MAE: {np.mean(np.abs(y_pred - y_true)) }', '\n') print('RMSE:', rms, '\n') print('Lasso Coef:') pp.pprint (to_print)

先貼一些代碼,後面做詳細解釋

第一次嘗試:基本模型,刪除評論少於30條的遊戲

# Setting a floor limit of 30 df1 = df1[df1.Reviews > 30]

Best Model: Lasso Score: 0.419 +- 0.073

第二次:「Reviews」 & 「OriginalPrice」 進行對數變換

df2.Reviews = np.log(df2.Reviews) df2.OriginalPrice = df2.OriginalPrice.astype(float) df2.OriginalPrice = np.log(df2.OriginalPrice)

Best Model: Lasso Score: 0.437 +- 0.104

第三次:將mantag進行onehot編碼

# Checking to make sure the dummies are separated correctly pd.get_dummies(df3.Main_Tag).head(5) # Adding dummy categories into the dataframe df3 = pd.concat([df3, pd.get_dummies(df3.Main_Tag).astype(int)], axis = 1) # Drop original string based column to avoid conflict in linear regression df3.drop('Main_Tag', axis = 1, inplace=True)

Best Model: Lasso Score: 0.330 +- 0.073

第四次:嘗試把所有非數值數據都進行onehot編碼

# we can get dummies for each tag listed separated by comma split_tag = df4.All_Tags.astype(str).str.strip('[]').str.get_dummies(', ') # Now merge the dummies into the data frame to start EDA df4= pd.concat([df4, split_tag], axis=1) # Remove any column that only has value of 0 as precaution df4 = df4.loc[:, (df4 != 0).any(axis=0)]

Best Model: Lasso Score: 0.359 +- 0.080

第五次:整合2和4次操作

# Dummy all top 5 tags split_tag = df.All_Tags.astype(str).str.strip('[]').str.get_dummies(', ') df5= pd.concat([df5, split_tag], axis=1) # Log transform Review due to skewed pairplot graphs df5['Log_Review'] = np.log(df5['Reviews'])

Best Model: Lasso Score: 0.359 +- 0.080

看到結果後,發現與第4次得分完全相同,這意味著「評論」對摺扣百分比絕對沒有影響。所以這一步操作可以不做,對結果沒有任何影響

第六次:對將「評論」和「發布後的天數」進行特殊處理

# Binning reviews (which is highly correlated with popularity) based on the above 75 percentile and 25 percentile df6.loc[df6['Reviews'] < 33, 'low_pop'] = 1 df6.loc[(df6.Reviews >= 33) & (df6.Reviews < 381), 'mid_pop'] = 1 df6.loc[df6['Reviews'] >= 381, 'high_pop'] = 1 # Binning Days_Since_Release based on the above 75 percentile and 25 percentile df6.loc[df6['Days_Since_Release'] < 418, 'new_game'] = 1 df6.loc[(df6.Days_Since_Release >= 418) & (df6.Days_Since_Release < 1716), 'established_game'] = 1 df6.loc[df6['Days_Since_Release'] >= 1716, 'old_game'] = 1 # Fill all the NaN's df6.fillna(0, inplace = True) # Drop the old columns to avoid multicolinearity df6.drop(['Reviews', 'Days_Since_Release'], axis=1, inplace = True)

這兩列被分成三個特徵。

Best Model: Ridge Score: 0.273 +- 0.044

第七次:拆分其他特徵並刪除不到30條評論的結果。

# Setting a floor threshold of 30 reivews for the data frame to remove some outliers df7 = df7[df7.Reviews > 30] # Binning based on 50% df7.loc[df7['Reviews'] < 271, 'low_pop'] = 1 df7.loc[df7['Reviews'] >= 271, 'high_pop'] = 1 df7.loc[df7['Days_Since_Release'] < 1167, 'new_game'] = 1 df7.loc[df7['Days_Since_Release'] >= 1167, 'old_game'] = 1 # Fill all NaN's df7.fillna(0, inplace= True) # Drop old columns to avoid multicolinearity df7.drop(['Reviews', 'Days_Since_Release'], axis=1, inplace = True)

Best Model: Lasso Score: 0.313 +- 0.098

清洗總結:讓我們從數據清理產生的一些統計數據開始:

現在,讓我們看看影響折扣率的前兩個特性是什麼:

但是什麼不影響折扣率呢?讓我們看看不影響折扣率的前兩個特性是什麼:

最好的模型實際上是誤差最小的基線模型。

0.42的R方看起來並不是很好,但是這與Steam如何處理折扣有很大關係-因為只有出版商/開發商才有權對他們的遊戲進行打折。

這意味著折扣率將在很大程度上取決於每個出版商/開發商的營銷策略和他們的財務狀況。雖然我希望將來情況會有所改善,但我目前無法收集到這樣的數據。

用戶案例

這個模型看起來好像沒什麼實際用處,其實它也有實際的意義——它對在線視頻遊戲轉售商來說將特別有用。

如上圖所示,我的預測模型可以幫助他們預測下一個大折扣,這樣他們就可以更好地分配資源,潛在地增加利潤率。

本文作者:Da Guo

相關焦點

  • 一元線性回歸分析python - CSDN
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple Linear Regression多元線性回歸模型:MultivariateLinear Regression數據準備#多重線性回歸#數據準備import pandas as pddf=pd.read_csv('e:/python/out/corr.csv',encoding='utf8')df根據預測目標,確定自變量和因變量#多重線性回歸
  • 美賽真題回顧-多元線性回歸模型預測全球海平面上升幅度
    基於前面收集的數據和已有結果, 這裡將建立多元線性回歸模型來預測由於北極冰雪融化 (主要是格陵蘭冰蓋和北極海冰的融化) 所導致的全球海平 面上升幅度。如圖 1-16 所示為使用多元線性回歸模型對海平面上升幅度進行預測的流程。
  • python一元線性回歸分析專題及常見問題 - CSDN
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple Linear Regression多元線性回歸模型:MultivariateLinear Regression數據準備#多重線性回歸#數據準備import pandas as pddf=pd.read_csv('e:/python/out/corr.csv',encoding='utf8')df根據預測目標,確定自變量和因變量#多重線性回歸
  • 使用Python中的線性回歸通過語音診斷帕金森氏病
    本文,我們將創建一個簡單的python機器學習算法,以便能夠通過聲音來診斷該人是否為患者。我們將使用一組(健康者和帕金森病患者)音頻文件庫,通過對音頻進行一些測量來構建我們的機器學習數據集。建立機器學習數據集後,我們將使用SciKit Learn庫訓練線性回歸模型。最後,我們將構建一個python庫,這個庫可以輕鬆集成到其他應用程式中。數據集首先,我們需要將音頻文件轉換成包含音頻測量值以及患者是否健康標誌的表格。
  • 線性回歸:簡單線性回歸詳解
    文中將線性回歸的兩種類型:一元線性回歸和多元線性回歸,本文主要介紹了一元線性回歸的技術細節:誤差最小化、標準方程係數、使用梯度下降進行優化、殘差分析、模型評估等。在文末給出了相關的GitHub地址。Linear Regression — Detailed View詳細解釋線性回歸線性回歸用於發現目標與一個或多個預測變量之間的線性關係。 有兩種類型的線性回歸 – 一元線性回歸(Simple)和多元線性回歸(Multiple)。
  • Python數據科學:線性回歸
    人工智慧/機器學習/模式識別:神經網絡算法,模仿人類神經系統運作,不僅可以通過訓練數據進行學習,而且還能根據學習的結果對未知的數據進行預測。/ 02 / 回歸方程01 簡單線性回歸簡單線性回歸只有一個自變量與一個因變量。
  • python多重線性回歸分析
    一個簡單的線性回歸模型測試。定義:線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。表達形式為y =aX+b,b為誤差服從均值為0的正態分布,a為截距。
  • Python數據分析|線性回歸
    Python數據分析學習筆記,今天分享下利用Python對業務進行數據預處理,並利用線性回歸進行數據預測。壹 數據導入Python下載及環境配置這裡就不贅述了哈,網上教程非常多,我們直接一開始就進入乾貨,打它一個開門見山。
  • 了解線性回歸的數學原理:線性回歸背後的微積分
    線性回歸通常是任何機器學習課程的起點。目的是預測輸入變量與目標變量之間的線性關係。天真的情況是穿過空間原點的直線。在這裡,我們僅限於二維空間,即笛卡爾平面。讓我們從y = mx格式開始逐步發展,然後從y = mx + c回歸開始。y = mx的簡化方案在這種情況下,我們知道我們要對通過原點的數據擬合一條線。
  • 線性回歸分析詳解10(完結篇):線性回歸分析預測的十大步驟
    許栩原創專欄《從入門到高手:線性回歸分析詳解》第10章,這是本專欄的最後一章,是專欄的完結篇:用線性回歸分析做預測,多元線性回歸分析預測的十大步驟。線性回歸分析專格欄總目錄請見上圖,前9章,我分別講述了回歸分析及與回分析相關的概念,一元、多元線性回歸分析的公式與計算方法,以及多重共線性、回歸方程的精度、顯著性驗證和置信區間等進行回歸分析的重要步驟及其計算方法。至此,以回歸分析進行需求預測的各項知識點及各項準備工作全部完成,我們可以正式的以回歸分析進行需求預測。
  • 原理+代碼|Python實戰多元線性回歸模型
    從上表中,不難發現:該名義變量有 n 類,就能拆分出 n 個虛擬變量巧妙的使用 0 和 1 來達到「用虛擬變量列代替原名義變量所在類別」接下來要做的就是將生成的虛擬變量們放入多元線性回歸模型多重線性回歸模型的主要假設之一是我們的預測變量(自變量)彼此不相關。我們希望預測變量(自變量)與反應變量(因變量)相關,而不是彼此之間具有相關性。
  • 多元線性回歸預測spss - CSDN
    回歸一直是個很重要的主題。因為在數據分析的領域裡邊,模型重要的也是主要的作用包括兩個方面,一是發現,一是預測。而很多時候我們就要通過回歸來進行預測。關於回歸的知識點也許不一定比參數檢驗,非參數檢驗多,但是複雜度卻絕對在其上。回歸主要包括線性回歸,非線性回歸以及分類回歸。本文主要討論多元線性回歸(包括一般多元回歸,含有虛擬變量的多元回歸,以及一點廣義差分的知識)。
  • 一文教你全面掌握用Python實現線性回歸
    因此,假設在一個線性方程中,自變量x可以解釋因變量,那麼變化比例就高, R 將接近1。反之,則接近0。多元線性回歸理論在現實生活中,不會出現一個自變量預測因變量的情況。所以,線性回歸模型是一次只分析一個自變量嗎?當然不是了,實際情況中採取多元線性回歸。
  • 論文推薦王苗苗:無縫線性回歸與預測模型
    無縫線性回歸與預測模型王苗苗, 李博峰
  • 第四十講 R-線性回歸:預測模型及可信區間
    今天的課程將繼續帶大家學習R-線性回歸:預測模型及可信區間。線性回歸的一個主要目標是基於一個或多個預測變量來預測結果值。(我們也用它來研究兩個變量的相關性,同時校正其他混雜因素)。那麼,當我們取得了預測模型後,根據該預測模型對新數據進行預測得出的預測值是什麼?這個預測值的可信度如何呢?今天的講解中,我們會給出答案。我們首先建立一個簡單的線性回歸模型,該模型根據速度預測汽車的停車距離。
  • 使用Python預測缺失值
    讓我們建立一個線性回歸模型,用「points」來預測「price」。首先,讓我們從「scikit learn」導入「LinearRegresssion」模塊:from sklearn.linear_model import LinearRegression現在,讓我們為訓練和測試拆分數據。我們希望能夠預測缺失值,但我們應該使用真實值「price」來驗證我們的預測。
  • python模擬簡單線性回歸
    通過輸入已有的數值對(x,y),建立模型,再次輸入x的值時可以預測y的值代碼如下:from math import sqrtfrom random import seedfrom random import randrangefrom csv import readerfrom math import sqrtfrom matplotlib import
  • 8種用Python實現線性回歸的方法,究竟哪個方法最高效?
    今天,讓我們來談談線性回歸。沒錯,作為數據科學界元老級的模型,線性回歸幾乎是所有數據科學家的入門必修課。拋開涉及大量數統的模型分析和檢驗不說,你真的就能熟練應用線性回歸了麼?未必!在這篇文章中,文摘菌將介紹8種用Python實現線性回歸的方法。了解了這8種方法,就能夠根據不同需求,靈活選取最為高效的方法實現線性回歸。
  • 線性回歸
    1、標準化對於多元線性回歸需要對各個自變量進行標準化,排除單位的影響。標準化方法:即將原始數據減去相應變量的均數後再除以該變量的標準差,而標準化得到的回歸方程稱為標準化回歸方程,相應得回歸係數為標準化回歸係數。
  • 線性回歸中+t值的含義_線性回歸 y截距p值的計算 - CSDN
    線性回歸模型的基本特性就是:模型是參數的線性函數。最簡單的線性回歸模型當然是模型是參數的線性函數的同時,也是輸入變量的線性函數,或者叫做線性組合。一般線性回歸對於一個一般的線性模型而言,其目標就是要建立輸入變量和輸出變量之間的回歸模型。該模型是既是參數的線性組合,同時也是輸入變量的線性組合。