python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究
在機器學習中,高維數據的分類問題非常具有挑戰性。有時候,非常簡單的問題會因為這個“維度詛咒”問題變得非常復雜。在本文中,我們將了解不同分類器的準確性和性能是如何變化的。
理解數據
對于本文,我們將使用Kaggle的“EEG Brainwave Dataset”(https://www.kaggle.com/birdy654/eeg-brainwave-dataset-feeling-emotions) 。該機器學習數據集包含來自EEG headset的電子腦電波信號,并且是時間格式的。
首先,讓我們先讀取數據,Python代碼如下:
import pandas as pdbrainwave_df = pd.read_csv('../data/emotions.csv', index_col=False)brainwave_df.head()該機器學習數據集中有2549列,“label”是我們分類問題的目標列。其他所有列,如“mean_d_1_a”、“mean_d2_a”等,都描述了腦電波信號讀取的特征。以“fft”前綴開始的列很可能是原始信號的“快速傅里葉變換”。我們的目標列“label”描述了情緒的程度。
正如Kaggle所說,這是一個挑戰:“我們能從腦電波讀數預測情緒嗎?”
讓我們首先理解列'label'中的類分布,Python代碼如下:
import seaborn as snsimport matplotlib.pyplot as pltplt.figure(figsize=(12,5))sns.countplot(x=brainwave_df.label, color='mediumseagreen')plt.title('Emotional sentiment class distribution', fontsize=16)plt.ylabel('Class Counts', fontsize=16)plt.xlabel('Class Label', fontsize=16)plt.xticks(rotation='vertical');圖1
因此,情緒有三個類別,“POSITIVE(正面)”,“NEGATIVE(負面)”和“NEUTRAL(中性)”。從條形圖中可以清楚地看出,類分布沒有偏態,它是一個帶有目標變量“label”的“多類分類”問題。我們將嘗試不同的分類器,看看準確度。
在應用任何分類器之前,應將“label”列與其他特征列分開('mean_d_1_a','mean_d2_a'等是特征)。
label_df = brainwave_df['label']brainwave_df.drop('label', axis = 1, inplace=True)brainwave_df.head()由于這是一個“分類”問題,我們將按照以下約定對每個“分類器”進行嘗試:
對于上述內容,我們將主要使用Python中的scikit-learn包。由于這里的特征數量非常多,因此將從一個適用于高維數據的分類器開始。
隨機森林分類器
隨機森林是一種基于樹和bagging方法的集成分類器。采用概率熵計算方法,自動減少特征個數。讓我們看看Python實現:
%%timefrom sklearn.pipeline import Pipelinefrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import cross_val_score, train_test_splitpl_random_forest = Pipeline(steps=[('random_forest', RandomForestClassifier())])scores = cross_val_score(pl_random_forest, brainwave_df, label_df, cv=10,scoring='accuracy')print('Accuracy for RandomForest : ', scores.mean())準確度非常好,達到97.7%,“總時間”非常短(僅限3.29秒)。
對于該分類器,不需要諸如縮放或噪聲去除之類的預處理階段,因為它完全基于概率并且完全不受縮放因子的影響。
邏輯回歸分類器
“邏輯回歸”是一種線性分類器,其工作方式與線性回歸相同。
%%timefrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionpl_log_reg = Pipeline(steps=[('scaler',StandardScaler()), ('log_reg', LogisticRegression(multi_class='multinomial', solver='saga', max_iter=200))])scores = cross_val_score(pl_log_reg, brainwave_df, label_df, cv=10,scoring='accuracy')print('Accuracy for Logistic Regression: ', scores.mean())我們可以看到準確度(93.19%)低于'RandomForest','時間'更高(2分7秒)。
“邏輯回歸”受到因變量的不同值范圍的嚴重影響,因此強制“特征縮放”。這就是為什么來自scikit-learn的'StandardScaler'被添加為預處理階段的原因。它根據具有零均值和單位方差的高斯分布自動縮放特征,因此所有變量的值范圍從-1到+1。
花費大量時間的原因是因為高維性和縮放時間。數據集中有2549個變量,每個變量的系數應根據邏輯回歸過程進行優化。此外,還有一個多重共線性的問題。這意味著線性相關變量應該組合在一起,而不是單獨考慮它們。
多重共線性的存在影響準確性。所以現在的問題是,“我們能否減少變量的數量,減少多重共線性,并改善'花費的時間'呢?”
主成分分析(PCA)
PCA可以將原始的低級變量轉換為更高維的空間,從而減少所需變量的數量。所有的共線性變量聚在一起。讓我們做一個PCA的數據:
from sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaled_df = scaler.fit_transform(brainwave_df)pca = PCA(n_components = 20)pca_vectors = pca.fit_transform(scaled_df)for index, var in enumerate(pca.explained_variance_ratio_): print("Explained Variance ratio by Principal Component總結
以上是生活随笔為你收集整理的python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle无法创建监听器,关于Orac
- 下一篇: python爬虫爬汽车图片_Python