利潤預(yù)測不再困難,scikit-learn線性回歸法讓你事半功倍
1、簡介
生成式人工智能無疑是一個(gè)改變游戲規(guī)則的技術(shù),但對于大多數(shù)商業(yè)問題來說,回歸和分類等傳統(tǒng)的機(jī)器學(xué)習(xí)模型仍然是首選。
想象一下像私募股權(quán)或風(fēng)險(xiǎn)投資這樣的投資者如何利用機(jī)器學(xué)習(xí)。要回答這樣的問題,首先必須了解投資者關(guān)注的數(shù)據(jù)以及它是如何被使用的。投資公司的決策不僅僅基于可量化的數(shù)據(jù),如支出、增長和燒錢率等,還包括創(chuàng)始人的記錄、客戶反饋、產(chǎn)品體驗(yàn)等定性數(shù)據(jù)。
本文將介紹線性回歸的基礎(chǔ)知識,可以在這里找到完整的代碼。
【代碼】:https://github.com/RoyiHD/linear-regression
2、項(xiàng)目設(shè)置
本文將使用Jupyter Notebook進(jìn)行這個(gè)項(xiàng)目。首先導(dǎo)入一些庫。
導(dǎo)入庫
# 繪制圖表
import matplotlib.pyplot as plt
# 數(shù)據(jù)管理和處理
from pandas import DataFrame
# 繪制熱力圖
import seaborn as sns
# 分析
from sklearn.metrics import r2_score
# 用于訓(xùn)練和測試的數(shù)據(jù)管理
from sklearn.model_selection import train_test_split
# 導(dǎo)入線性模型
from sklearn.linear_model import LinearRegression
# 代碼注釋
from typing import List
3、數(shù)據(jù)
為了簡化問題,本文將使用區(qū)域數(shù)據(jù)。這些數(shù)據(jù)代表了公司的支出類別和利潤??梢钥吹揭恍┎煌瑪?shù)據(jù)點(diǎn)的示例。本文希望使用支出數(shù)據(jù)來訓(xùn)練一個(gè)線性回歸模型并預(yù)測利潤。
重要的是要理解本文將使用的數(shù)據(jù)描述的是一家公司的支出情況。只有將支出數(shù)據(jù)與收入增長、當(dāng)?shù)囟愂?、攤銷和市場狀況等數(shù)據(jù)結(jié)合起來時(shí),才能得到有意義的預(yù)測能力。
R&D Spend | Administration | Marketing | Spend Profit |
165349.2 | 136897.8 | 471784.1 | 192261.83 |
162597.7 | 151377.59 | 443898.53 | 191792.06 |
153441.51 | 101145.55 | 407934.54 | 191050.39 |
加載數(shù)據(jù)
companies: DataFrame = pd.read_csv("companies.csv", header = 0)
4、數(shù)據(jù)可視化
了解數(shù)據(jù)對于確定要使用的特征、需要進(jìn)行歸一化和轉(zhuǎn)換的特征、從數(shù)據(jù)中刪除異常值以及對特定數(shù)據(jù)點(diǎn)進(jìn)行的處理是很重要的。
目標(biāo)(利潤)直方圖
可以直接使用DataFrame繪制直方圖(Pandas使用Matplotlib來繪制數(shù)據(jù)幀),可以直接訪問利潤并繪制它。
companies['Profit'].hist( color='g', bins=100);
圖片
可以看到,利潤超過20萬美元的異常值非常少。由此還可以從中推斷出本文的數(shù)據(jù)代表的是具有特定規(guī)模的公司。由于異常值的數(shù)量相對較少,可以將其保留。
特征(支出)直方圖
在這里,本文想看到使用特征的直方圖并查看其分布情況。Y軸表示數(shù)字頻率,X軸表示支出。
companies[[
"R&D Spend",
"Administration",
"Marketing Spend"
]].hist(figsize=(16, 20), bins=50, xlabelsize=8, ylabelsize=8)
圖片
還可以看到有一個(gè)健康的分布,只有少量的異常值。根據(jù)直覺,可以預(yù)期在研發(fā)和市場營銷上花費(fèi)更多的公司利潤更高。從下面的散點(diǎn)圖中可以看出,研發(fā)支出和利潤之間存在明顯的相關(guān)性。
profits: DataFrame = companies[["Profit"]]
research_and_development_spending: DataFrame = companies[["R&D Spend"]]
figure, ax = plt.subplots(figsize = (9, 9))
plt.xlabel("R&D Spending")
plt.ylabel("Profits")
ax.scatter(
research_and_development_spending,
profits,
s=60,
alpha=0.7,
edgecolors="k",
color='g',
linewidths=0.5
)
圖片
可以通過相關(guān)熱圖進(jìn)一步探索支出和利潤之間的相關(guān)性。從圖中可以看出,研發(fā)和市場營銷支出與利潤的相關(guān)性比行政支出更高。
sns.heatmap(companies.corr())
圖片
5、模型訓(xùn)練
首先需要將數(shù)據(jù)集分割為訓(xùn)練集和測試集兩部分。Sklearn提供了一個(gè)輔助方法來完成這個(gè)任務(wù)。鑒于本文的數(shù)據(jù)集很簡單且足夠小,可以按照以下方式將特征和目標(biāo)分離開來。
數(shù)據(jù)集
features: DataFrame = companies[[
"R&D Spend",
"Administration",
"Marketing Spend",
]]
targets: DataFrame = companies[["Profit"]]
train_features, test_features, train_targets, test_targets = train_test_split(
features,
targets,
test_size=0.2
)
大多數(shù)數(shù)據(jù)科學(xué)家會使用不同的命名約定,如X_train、y_train或其他類似的變體。
模型訓(xùn)練
現(xiàn)在可以創(chuàng)建并訓(xùn)練模型了。Sklearn使事情變得非常簡單。
model: LinearRegression = LinearRegression()
model.fit(train_features, train_targets)
6、模型評估
本文希望對模型的性能及其可用性進(jìn)行評估。首先查看一下計(jì)算得到的系數(shù)。在機(jī)器學(xué)習(xí)中,系數(shù)是用來與每個(gè)特征相乘的學(xué)習(xí)到的權(quán)重或數(shù)值。期望看到每個(gè)特征都有一個(gè)學(xué)習(xí)系數(shù)。
coefficients = model.coef_
"""
We should see the following in our console
Coefficients [[0.55664299 1.08398919 0.07529883]]
"""
正如上述所看到的,有3個(gè)系數(shù),每個(gè)特征對應(yīng)一個(gè)系數(shù)(“研發(fā)支出”、“行政支出”、“市場營銷支出”)。還可以將其繪制成圖表,以便更直觀地了解每個(gè)系數(shù)。
plt.figure()
plt.barh(train_features.columns, coefficients[0])
plt.show()
圖片
計(jì)算誤差
本文希望了解模型的誤差率,將使用Sklearn的R2得分。
test_predictions: List[float] = model.predict(test_features)
root_squared_error: float = r2_score(test_targets, test_predictions)
"""float
We should see an ouput similar to this
0.9781424529214315
"""
離1越近,模型就越準(zhǔn)確。實(shí)際上可以用一種非常簡單的方式對這一點(diǎn)進(jìn)行測試。
可以取數(shù)據(jù)集的第一行。如果使用下面的支出模型來預(yù)測利潤,期望得到一個(gè)足夠接近192261美元的數(shù)字。
"R&D Spend" | "Administration" | "Marketing Spend" | "Profit"
165349.2 136897.8 471784.1 192261.83
接下來創(chuàng)建一個(gè)推理請求。
inference_request: DataFrame = pd.DataFrame([{
"R&D Spend":165349.2,
"Administration":136897.8,
"Marketing Spend":471784.1
}])
運(yùn)行模型。
inference: float = model.predict(inference_request)
"""
We should get a number that is around
199739.88721901
"""
現(xiàn)在可以看到的誤差率是abs(199739-192261)/192261=0.0388。這是非常準(zhǔn)確的。
7、結(jié)論
處理數(shù)據(jù)、搭建模型和分析數(shù)據(jù)有很多方法。沒有一種解決方案適用于所有情況,當(dāng)用機(jī)器學(xué)習(xí)解決業(yè)務(wù)問題時(shí),其中一個(gè)關(guān)鍵過程是搭建多個(gè)旨在解決同一個(gè)問題的模型,并選擇最有前途的模型。