FI_CY_3D.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import matplotlib.pyplot as plt
  2. from sklearn.datasets import make_classification
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.ensemble import RandomForestClassifier
  5. from sklearn.inspection import permutation_importance
  6. from sklearn.preprocessing import StandardScaler
  7. from sklearn.metrics import accuracy_score
  8. import numpy as np
  9. import pandas as pd
  10. from master_funcs import *
  11. from imblearn.over_sampling import SMOTE
  12. from imblearn.under_sampling import RandomUnderSampler
  13. from imblearn.pipeline import Pipeline
  14. from imblearn.over_sampling import SMOTE
  15. import dill
  16. mr_cyl_touch_1=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Jan_touch.csv", index_col=0, delimiter=',', header=None)
  17. mr_cyl_touch_2=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Nicole_touch.csv", index_col=0, delimiter=',', header=None)
  18. mr_cyl_touch_3=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Jule_touch.csv", index_col=0, delimiter=',', header=None)
  19. mr_cyl_drag_1=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Jan_drag.csv", index_col=0, delimiter=',', header=None)
  20. mr_cyl_drag_2=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Nicole_drag.csv", index_col=0, delimiter=',', header=None)
  21. mr_cyl_drag_3=pd.read_csv("/mnt/DLC/DLC/3D_videos/manual_raters/Manual_Cylinder_Analyse_Jule_drag.csv", index_col=0, delimiter=',', header=None)
  22. patients=['PB_T2_3_1', 'PB_T2_3_2', 'PB_T2_3_3', 'PB_T2_4_2', 'PB_T2_5_1', 'PB_T2_6_1', 'PB_T2_6_2', 'PB_T3_23_1', 'PB_T3_23_2', 'PB_T3_23_3', 'PB_T3_24_1', 'PB_T3_24_2', 'PB_T3_24_3']
  23. for z in patients:
  24. Cyl_3D='/mnt/DLC/DLC/3D_videos/CY_3D/'+z+'_P3_CY_DLC_3D.csv'
  25. data=pd.read_csv(Cyl_3D, delimiter=',', skiprows=0, index_col=0, header=[1,2])
  26. coln=data.columns
  27. zero='cylinder_left'
  28. x='cylinder_top'
  29. y='cylinder_bottom'
  30. data=transform(data, zero, x, y)
  31. vel, acc=vel_acc(data, '3D')
  32. names=[i[0] for i in data.columns[::3]]
  33. df_vel=pd.DataFrame(vel)
  34. df_vel.columns=names
  35. df_vel=pd.concat([df_vel], keys=['velocity'], axis=1, names=['coords'])
  36. df_vel.columns.names=['coords', 'bodyparts']
  37. df_acc=pd.DataFrame(acc)
  38. df_acc.columns=names
  39. df_acc=pd.concat([df_acc], keys=['acceleration'], axis=1, names=['coords'])
  40. df_acc.columns.names=['coords', 'bodyparts']
  41. nnames=[]
  42. angle=angle_all(data, names[0], names[1], names[2])
  43. nnames.append(names[0]+'_'+names[1]+'_'+names[2])
  44. sum=0
  45. for i in range(1, len(names)):
  46. for j in range(i+1, len(names)):
  47. for k in range(i+2, len(names)):
  48. if i!=j!=k:
  49. angle=np.c_[angle,angle_all(data, names[i], names[j], names[k])]
  50. nnames.append(names[i]+'_'+names[j]+'_'+names[k])
  51. sum+=1
  52. print(sum, ' of 2870 angles')
  53. df_angle=pd.DataFrame(angle)
  54. df_angle.columns=nnames
  55. df_angle=pd.concat([df_angle], keys=['angle'], axis=1, names=['coords'])
  56. df_angle.columns.names=['coords', 'bodyparts']
  57. angle_vel=np.diff(df_angle[df_angle.columns[0]])
  58. for i in df_angle.columns[1:]:
  59. angle_vel=np.c_[angle_vel, np.diff(df_angle[i])]
  60. angle_vel=np.r_[angle_vel, [[0]*angle_vel.shape[1]]]
  61. df_angle_vel=pd.DataFrame(angle_vel)
  62. df_angle_vel.columns=nnames
  63. df_angle_vel=pd.concat([df_angle_vel], keys=['angle_velocity'], axis=1, names=['coords'])
  64. df_angle_vel.columns.names=['coords', 'bodyparts']
  65. angle_acc=np.diff(df_angle_vel[df_angle_vel.columns[0]])
  66. for i in df_angle_vel.columns[1:]:
  67. angle_acc=np.c_[angle_acc, np.diff(df_angle_vel[i])]
  68. angle_acc=np.r_[angle_acc, [[0]*angle_acc.shape[1], [0]*angle_acc.shape[1]]]
  69. df_angle_acc=pd.DataFrame(angle_acc)
  70. df_angle_acc.columns=nnames
  71. df_angle_acc=pd.concat([df_angle_acc], keys=['angle_acceleration'], axis=1, names=['coords'])
  72. df_angle_acc.columns.names=['coords', 'bodyparts']
  73. nnames=[]
  74. dis=distance_all(data, names[0], names[1])
  75. nnames.append(names[0]+'_'+names[1])
  76. sum=0
  77. for i in range(1, len(names)):
  78. for j in range(i+1, len(names)):
  79. dis=np.c_[dis, distance_all(data, names[i], names[j])]
  80. nnames.append(names[i]+'_'+names[j])
  81. sum+=1
  82. print(sum, 'of 231')
  83. df_dis=pd.DataFrame(dis)
  84. df_dis.columns=nnames
  85. df_dis=pd.concat([df_dis], keys=['distance'], axis=1, names=['coords'])
  86. df_dis.columns.names=['coords', 'bodyparts']
  87. dis_vel=np.diff(df_dis[df_dis.columns[0]])
  88. for i in df_dis.columns[1:]:
  89. dis_vel=np.c_[dis_vel, np.diff(df_dis[i])]
  90. dis_vel=np.r_[dis_vel, [[0]*dis_vel.shape[1]]]
  91. df_dis_vel=pd.DataFrame(dis_vel)
  92. df_dis_vel.columns=nnames
  93. df_dis_vel=pd.concat([df_dis_vel], keys=['distance_velocity'], axis=1, names=['coords'])
  94. df_dis_vel.columns.names=['coords', 'bodyparts']
  95. dis_acc=np.diff(df_dis_vel[df_dis_vel.columns[0]])
  96. for i in df_dis_vel.columns[1:]:
  97. dis_acc=np.c_[dis_acc, np.diff(df_dis_vel[i])]
  98. dis_acc=np.r_[dis_acc, [[0]*dis_acc.shape[1], [0]*dis_acc.shape[1]]]
  99. df_dis_acc=pd.DataFrame(dis_acc)
  100. df_dis_acc.columns=nnames
  101. df_dis_acc=pd.concat([df_dis_acc], keys=['distance_acceleration'], axis=1, names=['coords'])
  102. df_dis_acc.columns.names=['coords', 'bodyparts']
  103. df_vel_acc=pd.concat((df_vel, df_acc, df_angle, df_angle_vel, df_angle_acc, df_dis, df_dis_vel, df_dis_acc), axis=1)
  104. names=[]
  105. for i in range(0, len(df_vel_acc.columns)):
  106. names.append(df_vel_acc.columns[i][0]+'_'+df_vel_acc.columns[i][1])
  107. df_vel_acc.columns=names
  108. df_vel_acc=df_vel_acc.interpolate(method='polynomial', order=1)
  109. df_vel_acc=df_vel_acc.fillna(0)
  110. vid1=[]
  111. for j in [mr_cyl_touch_1, mr_cyl_touch_2, mr_cyl_touch_3]:
  112. df=j.fillna(0)
  113. for i in df.loc[z, :]:
  114. if i>0:
  115. vid1.append(i)
  116. y_touch=np.zeros(shape=(len(df_vel_acc),))
  117. for i in vid1:
  118. y_touch[int(i)]=1
  119. if np.count_nonzero(y_touch)>=6:
  120. over = SMOTE(sampling_strategy=0.1)
  121. under = RandomUnderSampler(sampling_strategy=0.2)
  122. steps = [('o', over), ('u', under)]
  123. pipeline = Pipeline(steps=steps)
  124. X_touch, y_touch = pipeline.fit_resample(df_vel_acc, y_touch)
  125. acc_score_touch = 0
  126. for i in range(100):
  127. if (i+1) % 10 == 0:
  128. print("iterations: {}/100".format(i+1))
  129. X_touch_train, X_touch_test, y_touch_train, y_touch_test = train_test_split(X_touch, y_touch)
  130. sc = StandardScaler()
  131. X_touch_train = sc.fit_transform(X_touch_train)
  132. X_touch_test = sc.transform(X_touch_test)
  133. rfc_touch = RandomForestClassifier(bootstrap=True).fit(X_touch_train, y_touch_train)
  134. pred_rfc_touch = rfc_touch.predict(X_touch_test)
  135. if accuracy_score(y_touch_test, pred_rfc_touch) > acc_score_touch:
  136. best_model_touch = rfc_touch
  137. acc_score_touch = accuracy_score(y_touch_test, pred_rfc_touch)
  138. result_touch = permutation_importance(best_model_touch, X_touch_test, y_touch_test, n_repeats=10, random_state=42)
  139. vid2=[]
  140. for j in [mr_cyl_drag_1, mr_cyl_drag_2, mr_cyl_drag_3]:
  141. df=j.fillna(0)
  142. for i in df.loc[z, :]:
  143. if i>0:
  144. vid2.append(i)
  145. y_drag=np.zeros(shape=(len(df_vel_acc),))
  146. for i in vid2:
  147. y_drag[int(i)]=1
  148. if np.count_nonzero(y_drag)>=6:
  149. over = SMOTE(sampling_strategy=0.1)
  150. under = RandomUnderSampler(sampling_strategy=0.2)
  151. steps = [('o', over), ('u', under)]
  152. pipeline = Pipeline(steps=steps)
  153. X_drag, y_drag = pipeline.fit_resample(df_vel_acc, y_drag)
  154. acc_score_drag = 0
  155. for i in range(100):
  156. if (i+1) % 10 == 0:
  157. print("iterations: {}/100".format(i+1))
  158. X_drag_train, X_drag_test, y_drag_train, y_drag_test = train_test_split(X_drag, y_drag)
  159. sc = StandardScaler()
  160. X_drag_train = sc.fit_transform(X_drag_train)
  161. X_drag_test = sc.transform(X_drag_test)
  162. rfc_drag = RandomForestClassifier(bootstrap=True).fit(X_drag_train, y_drag_train)
  163. pred_rfc_drag = rfc_drag.predict(X_drag_test)
  164. if accuracy_score(y_drag_test, pred_rfc_drag) > acc_score_drag:
  165. best_model_drag = rfc_drag
  166. acc_score_drag = accuracy_score(y_drag_test, pred_rfc_drag)
  167. result_drag = permutation_importance(best_model_drag, X_drag_test, y_drag_test, n_repeats=10, random_state=42)
  168. dill.dump_session('CY_'+z+'_data.pkl')
  169. print(z+' ready!')