读取文件中的随机一行 Random Probability

本文介绍了一种从大文件中随机选择一行的算法,并适用于不能完全加载到内存的大文件和文件流。此外,还讨论了如何生成0到n-1范围内m个不重复随机整数的有序列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有一个文本文件,文件中有若干行。要求返回随机的一行。每行的被选概率相同。
两种情况:
1、如果文件很大,不能全放入内存
2、如果是文件流

大文件的特点是不能载入内存随机读取,文件流的特点是只能读取一次。

//伪代码
i = 1
chosen_line = ""
while line has next:
	# random returns a uniform random number in [0,1)
	if random() < 1/i:   
		chosen_line = line
		i += 1
	line = line.next
return chosen_line

类似随机选取问题:对于整数m和n,其中m<n,输出0~n-1范围内m个随机整数的有序列表,不允许重复。

void GenKnuth(int m, int n) 
{ 
	for(int i=0; i<n; ++i) 
	{ 
		if((bigrand()%(n-i)) < m) 
		{ 
			cout<<i<<endl; 
			--m; 
		}
	}
}

计算每个i被输出的概率,会发现都是m/n,因此是等概率的随机选取。


<think>我们有一个新的需求:基于Excel临床数据建立随机森林模型,并生成多种可视化结果。我们将按照以下步骤进行:1.导入必要的库2.读取Excel数据3.数据预处理(处理缺失值、分类变量编码、划分训练集和测试集等)4.构建随机森林模型并进行训练5.在训练集和测试集上进行预测6.输出各种评估指标和可视化结果,包括:-ROC曲线(训练集和测试集)-校准曲线(CalibrationCurve)-决策曲线(DecisionCurve)-混淆矩阵(ConfusionMatrix)-SHAP可解释性分析(如特征重要性,SHAP摘要图等)注意:我们将使用sklearn的随机森林,以及一些可视化库(如matplotlib,seaborn,sklearn.metrics等)。对于SHAP,我们需要安装shap库。由于决策曲线分析(DCA)在Python中没有现成的库,我们需要自行实现或借用第三方代码。这里我们将使用一个自定义函数来实现决策曲线。另外,校标曲线(CalibrationCurve)可以使用`sklearn.calibration`中的`calibration_curve`。步骤详细说明:1.导入库2.读取Excel文件,假设数据在第一个sheet3.数据预处理:a.检查缺失值,并进行填充或删除(这里根据实际情况选择)b.将分类变量转换为数值(如果存在)c.划分特征和标签d.划分训练集和测试集4.构建随机森林模型,训练5.预测概率(为了绘制ROC曲线等需要概率)6.绘制训练集和测试集的ROC曲线7.绘制校准曲线8.绘制决策曲线(需要自定义函数)9.绘制混淆矩阵(测试集)10.使用SHAP分析并绘制图形我们将逐步编写代码,并添加详细注释。注意:决策曲线分析(DCA)是一种用于评估不同阈值下临床获益的曲线。我们这里将实现一个简单的版本。由于代码较长,我们将分块编写。首先,确保安装了必要的库:pandas,numpy,scikit-learn,matplotlib,seaborn,xgboost(如果需要使用XGBoost的DTree,但这里我们不用,所以可忽略),shap如果没有安装shap,请先安装:pipinstallshap开始编写代码:</think> 以下是用Python 3实现基于Excel临床数据的随机森林分类模型代码,包含详细注释和相关可视化: ```python # -*- coding: utf-8 -*- import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import (roc_auc_score, roc_curve, confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, brier_score_loss) from sklearn.calibration import calibration_curve import shap from sklearn.inspection import DecisionBoundaryDisplay # ====================== # 1. 数据准备与预处理 # ====================== # 读取Excel临床数据 data = pd.read_excel('临床数据.xlsx', sheet_name=0) # 假设数据在第一个工作表 # 数据清洗 - 处理缺失值 print(f"原始数据缺失值统计:\n{data.isnull().sum()}") data = data.dropna() # 删除包含缺失值的行(可根据需求使用插值) # 特征和标签分离 X = data.drop(['患者ID', '诊断结果'], axis=1) # 假设'诊断结果'是二分类标签列(0/1) y = data['诊断结果'] # 类别编码处理 (如果存在分类特征) # X = pd.get_dummies(X, columns=['分类特征列名']) # 数据集划分 (70%训练, 30%验证) X_train, X_val, y_train, y_val = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) print(f"训练集形状: {X_train.shape}, 验证集形状: {X_val.shape}") print(f"阳性样本比例: 训练集{np.mean(y_train):.2%}, 验证集{np.mean(y_val):.2%}") # ====================== # 2. 随机森林模型训练 # ====================== rf = RandomForestClassifier( n_estimators=100, # 树的数量 max_depth=10, # 树的最大深度 min_samples_split=5, # 节点分裂的最小样本数 min_samples_leaf=2, # 叶节点的最小样本数 random_state=42, class_weight='balanced' # 处理类别不平衡 ) rf.fit(X_train, y_train) # 模型训练 # ====================== # 3. 模型评估与可视化 # ====================== def evaluate_model(model, X_train, y_train, X_val, y_val): """评估模型性能并生成可视化结果""" # 预测概率 train_probs = model.predict_proba(X_train)[:, 1] val_probs = model.predict_proba(X_val)[:, 1] # 预测类别 train_preds = model.predict(X_train) val_preds = model.predict(X_val) # 1. ROC曲线 plt.figure(figsize=(10, 8)) # 训练集ROC fpr_train, tpr_train, _ = roc_curve(y_train, train_probs) auc_train = roc_auc_score(y_train, train_probs) plt.plot(fpr_train, tpr_train, label=f'Train AUC={auc_train:.3f}') # 验证集ROC fpr_val, tpr_val, _ = roc_curve(y_val, val_probs) auc_val = roc_auc_score(y_val, val_probs) plt.plot(fpr_val, tpr_val, label=f'Validation AUC={auc_val:.3f}') # 参考线 plt.plot([0, 1], [0, 1], 'k--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend(loc='lower right') plt.savefig('roc_curve.png') plt.close() # 2. 校准曲线 (可靠性图) plt.figure(figsize=(10, 8)) # 训练集校准 prob_true_train, prob_pred_train = calibration_curve( y_train, train_probs, n_bins=10 ) plt.plot(prob_pred_train, prob_true_train, 's-', label='Train') # 验证集校准 prob_true_val, prob_pred_val = calibration_curve( y_val, val_probs, n_bins=10 ) plt.plot(prob_pred_val, prob_true_val, 's-', label='Validation') # 参考线 plt.plot([0, 1], [0, 1], 'k:', label='Perfectly calibrated') plt.xlabel('Mean Predicted Probability') plt.ylabel('Fraction of Positives') plt.title('Calibration Curve') plt.legend() plt.savefig('calibration_curve.png') plt.close() # 3. 混淆矩阵 plt.figure(figsize=(8, 6)) cm = confusion_matrix(y_val, val_preds) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Negative', 'Positive'], yticklabels=['Negative', 'Positive']) plt.xlabel('Predicted') plt.ylabel('Actual') plt.title('Confusion Matrix') plt.savefig('confusion_matrix.png') plt.close() # 4. SHAP可解释性分析 explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_val) # 特征重要性图 plt.figure(figsize=(10, 8)) shap.summary_plot(shap_values, X_val, plot_type="bar", show=False) plt.title('Feature Importance') plt.savefig('shap_feature_importance.png') plt.close() # 单个预测解释图 plt.figure(figsize=(10, 8)) shap.summary_plot(shap_values[1], X_val, show=False) plt.title('SHAP Summary Plot') plt.savefig('shap_summary.png') plt.close() # 5. 决策曲线 (需要DCA库,此处简化为特征决策边界可视化) try: plt.figure(figsize=(10, 8)) disp = DecisionBoundaryDisplay.from_estimator( model, X_val.iloc[:, :2], response_method="predict", xlabel=X.columns[0], ylabel=X.columns[1], alpha=0.5 ) plt.scatter( X_val.iloc[:, 0], X_val.iloc[:, 1], c=y_val, edgecolor='k', s=20 ) plt.title("Decision Boundary") plt.savefig('decision_boundary.png') plt.close() except Exception as e: print(f"决策边界可视化异常: {e}") # 返回性能指标 metrics = { 'train_auc': auc_train, 'val_auc': auc_val, 'train_accuracy': accuracy_score(y_train, train_preds), 'val_accuracy': accuracy_score(y_val, val_preds), 'precision': precision_score(y_val, val_preds), 'recall': recall_score(y_val, val_preds), 'f1': f1_score(y_val, val_preds), 'brier_score': brier_score_loss(y_val, val_probs) } return metrics # 执行评估 metrics = evaluate_model(rf, X_train, y_train, X_val, y_val) print("\n模型性能指标:") for k, v in metrics.items(): print(f"{k}: {v:.4f}") # ====================== # 4. 结果保存 # ====================== # 保存特征重要性 feature_importance = pd.DataFrame({ 'Feature': X.columns, 'Importance': rf.feature_importances_ }).sort_values('Importance', ascending=False) feature_importance.to_csv('feature_importance.csv', index=False) # 保存预测结果 results = pd.DataFrame({ 'Actual': y_val.values, 'Predicted': rf.predict(X_val), 'Probability': rf.predict_proba(X_val)[:, 1] }) results.to_csv('predictions.csv', index=False) print("所有可视化结果已保存为PNG文件") ``` ### 代码说明: 1. **数据预处理**: - 读取Excel临床数据并处理缺失值 - 分离特征和标签(二分类目标变量) - 自动处理类别不平衡问题 2. **模型训练**: - 使用带平衡类别权重的随机森林 - 关键参数可调整:树数量、深度、分裂标准等 3. **可视化功能**: - **ROC曲线**:显示训练/验证集的AUC值 - **校准曲线**:评估预测概率的可靠性 - **混淆矩阵**:显示分类结果的真假正负例 - **SHAP分析**: - 特征重要性图 - 单个预测解释图 - SHAP摘要图 - **决策边界可视化**:展示分类决策面(取前两特征) 4. **输出内容**: - 所有可视化保存为PNG图片 - 特征重要性CSV文件 - 预测结果CSV文件 - 终端打印模型性能指标 ### 使用准备: 1. 安装依赖库: ```bash pip install pandas numpy matplotlib seaborn scikit-learn shap openpyxl xlrd ``` 2. 准备Excel数据: - 文件命名为`临床数据.xlsx` - 包含特征列和二分类标签列(默认列名为"诊断结果") - 需包含患者ID列(处理时自动排除) ### 注意事项: 1. 实际使用时需根据数据调整: - 标签列名称(修改`y = data['诊断结果']`) - 需排除的列(修改`X = data.drop(...)`) - 分类特征编码(取消注释类别编码部分) 2. 决策曲线分析(DCA)需要专用库,可用`pip install decision-curve-plot`并添加: ```python from decision_curve_plot import plot_decision_curve plot_decision_curve(y_val, val_probs, legend_loc='lower right') plt.savefig('decision_curve.png') ``` 以上代码实现了完整的随机森林建模流程,生成的图像可用于临床决策支持研究[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值