import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
np.random.seed(42)
n = 500
df = pd.DataFrame({
'recency': np.random.exponential(30,n),
'frequency': np.random.poisson(10,n),
'monetary': np.random.exponential(500,n)+50,
'tenure': np.random.uniform(1,60,n)
})
df.loc[:100,'recency']=np.random.exponential(5,100)
df.loc[:100,'frequency']=np.random.poisson(30,100)
df.loc[:100,'monetary']=np.random.exponential(2000,100)+500
for c in ['recency','monetary']:
df[c+'_log'] = np.log1p(df[c])
features = ['recency_log','frequency','monetary_log','tenure']
X = StandardScaler().fit_transform(df[features])
print("=== K-Means分群 ===")
for k in [3,4,5,6]:
km = KMeans(n_clusters=k,n_init=10,random_state=42)
labels = km.fit_predict(X)
print("K={}: Silhouette={:.4f}".format(k, silhouette_score(X,labels)))
km4 = KMeans(n_clusters=4,n_init=10,random_state=42)
df['cluster'] = km4.fit_predict(X)
print("\n=== 分群画像 ===")
profile = df.groupby('cluster')[['recency','frequency','monetary','tenure']].mean()
print(profile.round(2))
print("\n=== GMM软聚类 ===")
gmm = GaussianMixture(n_components=4,random_state=42).fit(X)
proba = gmm.predict_proba(X)
print("前5客户簇概率:")
for i in range(5):
print(" 客户{}: {}".format(i, proba[i].round(3)))
运行结果
⚠️ Error:
Traceback (most recent call last):
File "<string>", line 18, in <module>
File "/usr/local/lib/python3.12/dist-packages/pandas/core/indexing.py", line 938, in __setitem__
iloc._setitem_with_indexer(indexer, value, self.name)
File "/usr/local/lib/python3.12/dist-packages/pandas/core/indexing.py", line 1953, in _setitem_with_indexer
self._setitem_with_indexer_split_path(indexer, value, name)
File "/usr/local/lib/python3.12/dist-packages/pandas/core/indexing.py", line 2009, in _setit
⚠️ 验证部分失败
深入理解:从项目到产品的关键步骤
ML项目成功的关键因素
定义清晰的目标:业务指标 > ML指标(提升AUC不是目的,提升收入才是)
数据质量:Garbage in, garbage out。花80%时间在数据上是正常的
简单优先:简单基线 > 复杂模型(如果简单就够了)
持续监控:模型上线不是终点,漂移检测和重训练是必须的
沟通能力:能向非技术人解释模型为什么做某个预测
项目时间分配建议
阶段
时间占比
关键产出
问题定义
10%
明确的评估指标和成功标准
数据获取/清洗
30%
干净可用的数据集
特征工程
25%
强特征集
模型训练/调优
20%
最优模型
评估/部署
15%
上线模型+监控方案
从竞赛到生产的差距
Kaggle竞赛和实际生产的差异:
竞赛数据已经清洗过;生产数据需要自己清洗
竞赛只看预测精度;生产要考虑延迟、成本、可解释性
竞赛是一次性的;生产需要持续监控和迭代
竞赛没有SLO;生产有严格的延迟和可用性要求
竞赛不考虑公平性和隐私;生产必须合规
ML系统技术债
D. Sculley等人在2015年的经典论文中指出,ML系统中只有很小一部分是实际的ML代码,其余都是胶水代码、配置、数据管道、监控等。隐藏的技术债包括: