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