---
description: >-
  研究发射测量斜率和时滞热频率表征，使用外推法计算三维磁场并定性比较,使用基于焓的热演化环模型模拟每条线的热力学响应，测试低频、中频和高频热场景,使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算,使用直方图显示发射测量斜率，计算互相关映射
---

# Python热频随机森林分类器算法模型模拟

{% embed url="https://viadean.notion.site/Python-c8d04732b3a6457a88c1072be3b11adf" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

### 🍇Python随机森林模型

#### 引导聚合

在需要良好模型可解释性的应用中，决策树效果非常好，尤其是在深度较小的情况下。然而，具有真实世界数据集的决策树具有很大的深度，深度较高的决策树更容易过度拟合，从而导致模型的方差更大。随机森林模型探索了决策树的这一缺点。在随机森林模型中，原始训练数据是随机抽样并替换的，从而生成小的数据子集（见下图）。这些子集也称为引导样本。然后，这些引导样本作为训练数据输入到许多大深度的决策树中。每个决策树都基于这些引导样本单独训练。这种决策树的聚合称为随机森林集成。集成模型的最终结果通过计算所有决策树的多数票来确定。由于每个决策树都以不同的训练数据集作为输入，因此原始训练数据集中的偏差不会影响从决策树聚合中获得的最终结果。

生成有放回的引导样本：

{% @mermaid/diagram content="stateDiagram-v2
direction LR
so:猫、狗、马、牛、鼠
s1:猫、狗、马
s2:牛、狗、猫
s3:鼠、马、猫
s4:决策树1
s5:决策树2
s6:决策树3
so-->s1 s1-->s4
so-->s2 s2-->s5
so-->s3 s3-->s6" %}

#### 随机森林算法

随机森林算法有三个主要超参数，需要在训练之前设置。这些包括节点大小、树的数量和采样的特征数量。从这里开始，随机森林分类器可用于解决回归或分类问题。随机森林算法由一组决策树组成，集合中的每棵树都由从有替换训练集中抽取的数据样本组成，称为引导样本。在该训练样本中，三分之一被留作测试数据，称为袋外样本。然后通过特征装袋注入另一个随机性实例，为数据集增加更多多样性并降低决策树之间的相关性。根据问题的类型，预测的确定会有所不同。对于回归任务，将对各个决策树进行平均，对于分类任务，多数投票（即最常见的分类变量）将产生预测类。最后，然后使用袋外样本进行交叉验证，最终确定该预测。

{% @mermaid/diagram content="stateDiagram-v2
  classDef gn fill:green
    [*] --> s11:::gn
    [*] --> s12:::gn
    [*] --> s13:::gn
    s11-->s21 s11-->s22:::gn
    s12-->s23 s12-->s24:::gn
    s13-->s25 s13-->s26:::gn
    s21-->s31 s21-->s32 s22-->s33:::gn s22-->s34 
    s23-->s35 s23-->s36 s24-->s37 s24-->s38:::gn s25-->s39 s25-->s40 s26-->s41:::gn s26-->s42
    s31-->s43 s31-->s44 s32-->s45 s32-->s46 s33-->s47:::gn s33-->s48 s34-->s49 s34-->s50 s35-->s51
    s35-->s52 s36-->s53 s36-->s54 s37-->s55 s37-->s56 s38-->s57 s38-->s58:::gn s39-->s60 s39-->s61
    s40-->s62 s40-->s63 s41-->s64:::gn s41-->s65 s42-->s66 s42-->s67  
    sf:$$\Sigma$$
    s47-->sf s58-->sf s64-->sf" %}

随机森林算法结合了 (1) 引导聚合和 (2) 特征随机性，使用同一数据集构建许多决策树。

* 引导聚合是一种在给定迭代次数和变量（引导样本）内随机抽取数据子集的技术。通常对所有迭代和样本的预测进行平均，以获得最可能的结果。重要的是要理解，它不是将数据“分块”成小块并在其上训练单个树，而是仍然保持初始数据大小。这是一个应用集成模型的示例。
* 特征随机性的主要作用是降低决策树模型之间的相关性。与可以利用所有特征来辨别最佳节点分割的决策树相比，随机森林算法将随机选择这些特征进行决策。最终，这也允许在不同的特征上进行训练。

#### Python分类器

```python
import pandas as pd
import numpy as np
from umap import UMAP
import seaborn as sns
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
```

```python
mypath = '*insert file path/waveforms.csv'
data = pd.read_csv(mypath, index_col = 'uid')
print(f'{data.shape[0]} unique experiment identifiers (uid), recorded with a sampling frequency (KHz) of {((data.shape[1]-1)/5)}')
data.organoid.value_counts()
```

定义可视化颜色

```python
mycolors = {'Data_D':     '#FFA500',
           'Data_G':       '#4169E1', 
           'Data_F':       '#FF4500', 
           'Data_C':       '#9400D3', 
           'Data_A':       '#32CD32',  
           'Data_E':       '#228B22', 
           'Data_G_V2' :   '#006400',  
           'Data_H':       '#00BFFF',  
           'Data_E_V2':    '#DC143C', 
           'Data_F_V2':    '#0000FF', 
           'Data_B':       '#000000', 
           }
data['color'] = data['organoid'].apply(lambda orgID: mycolors[orgID])
```

可视化唯一的实验标识符

```python
fig, ax = plt.subplots(figsize=(15, 8))
sns.barplot(x=data.organoid.value_counts().index, y=data.organoid.value_counts(), palette=mycolors)

plt.xticks(rotation=30,fontsize=14)
plt.yticks(fontsize=14)
ax.set_xlabel('Class type', fontsize=16)
ax.set_ylabel('Number of waveforms', fontsize=16)
plt.rcParams["font.family"] = "Arial"

right_side = ax.spines["right"]
right_side.set_visible(False)
top_side = ax.spines["top"]
top_side.set_visible(False)
plt.savefig('Figures/barplot.png', dpi = 300, bbox_inches="tight")
plt.show()
```

鉴于我们正在分析细胞外记录，我们将可视化每个数据集类别产生的平均波形。

```python
class_names = data['organoid'].unique()
fig, ax = plt.subplots(1,9, figsize=(24,4.5))
for unique_class in class_names:    
        df_new = data[data['organoid'] == unique_class] 
        df_new = df_new.iloc[:,:-2].to_numpy() 
        data_mean_perclass = np.mean(df_new, axis=0)
        sampling_freq = np.linspace(0, 5, 150) 
for i in range(class_names.shape[0]): 
            if unique_class == class_names[i]:
                
                for row_num in range(df_new.shape[0]): 
                    ax[i].plot(sampling_freq, df_new[row_num,:], color = 'lightgray')

                ax[i].plot(sampling_freq,data_mean_perclass, color=mycolors[unique_class], linewidth=3)
                ax[i].set_ylim([-1.8, 1.8])
                ax[i].grid()
                ax[i].axis('off')
                ax[i].title.set_text(unique_class)  
                plt.rcParams["font.family"] = "Arial"
                
            else: 
                continue
        
        scalebar = AnchoredSizeBar(ax[8].transData, 1, "1 ms", 'lower right', frameon=False, size_vertical=0.02, pad=0.1)
        ax[8].add_artist(scalebar)
        
plt.savefig('Figures/spikes.png', dpi = 300)
```
