I have ML model which is trained on Afib, Normal, Other - 3 class. Currently when I am testing the model with unseen database, sometimes it identify PVC singals as Afib class.
For example -
These are normal ECG records having PVC ( Premature Ventricular Complex ) - Reversed peaks in it.
But my ML model tag it as
So I want to tell model, that if this is the kind of signal it has, it should be PVC, and should not consider it as
What I tried.
- Extract P wave and train the model with p - wave feature. PVC does not have p-wave in it but afib has. So I thought it will understand that not to consider PVC as afib
def plot_peak_detection(ecg, rate): import matplotlib.pyplot as plt dt = 1.0/rate t = np.linspace(0, len(ecg)*dt, len(ecg)) plt.plot(t, ecg) peak_i = detect_beats(ecg, rate) plt.scatter(t[peak_i], ecg[peak_i], color='red') plt.show() def pwave_extract(ecg_arr, lpwp, rpwp): loc = list(zip(lpwp, rpwp)) pwave_arr =  for els in loc: pwave_arr.append( ecg_arr[els:els] ) return pwave_arr
- Extract R-S peak amplitutude. Because when we have PVC R-S amplitute comes high. So add this amplitutde max and min value as two feature in model. Afib does not have R-S amplitude so high so going forward it will not mark PVC as Afib. But this logic also did not work
def QRS_test(ecg): R_peaks, S_peack, Q_point=EKG_QRS_detect(ecg, 320, True, True) scipy_plot(ecg) ampt_list =  if len(R_peaks) >= len(S_peack): for i in range(0, len(R_peaks)): try: ecg_slice = ecg[R_peaks[i]:S_peack[i]] ampt_list.append(max(ecg_slice)-min(ecg_slice)) except: pass return ampt_list
- Calculate IQR ( Interquartile range ) for amplitude values of R-S peaks. And consider Q1, Q3 as additional feature in model. But this also does not help to solve the problem
Is there any other way I can clearly distingush PVC signal and give this feature to model, so that model does not tag ECg with PVC pattern in it as Afib.