目前我的数据集如下:
Injury_Type Organ PositionGroup Age speed[injured] [back] LW 30.929500 5.239167 [torn] [biceps] CB 26.26 4.53[torn] [ACL] LB 26.15 4.44
还有更多类似的行,关联了球员受伤的类型、受伤的器官、他们所打的位置以及他们的年龄和速度。我的目标是预测球员将缺席的比赛场数。我正在尝试训练一个模型来预测球员将缺席的比赛场数。
一些列是存储在数组中的,这在我在sklearn中运行模型时遇到了一些问题。我该如何解决这个问题?我是sklearn的新手,如果你们有关于预测球员缺席比赛场数的过程的任何反馈,那将非常有帮助。我正在尝试构建一个随机森林分类器,首先查看特征重要性,然后进行K折交叉验证,缩放特征,最后在几个ML算法上训练模型。
你认为这是个好方法吗?你会建议做任何改变吗?
回答:
你应该使用CountVectorizer
。在这里你可以将多个项目放入数组中。
对于Injury_Type,可以是['back','leg']
,对于Organ,也可以接受多个输入。
CountVectorizer会将每个独特的项目转换成一个虚拟变量。从那时起,你可以使用这些列来训练一个新模型。
import pandas as pdimport astdata = pd.read_csv('injury.txt',sep=';',converters={'Injury_Type': ast.literal_eval, 'Organ': ast.literal_eval})dataInjury_Type Organ PositionGroup Age speed daysmissing0 [back] [back] LW 30.9295 5.239167 201 [torn] [biceps] CB 26.2600 4.530000 102 [torn] [ACL] LB 26.1500 4.440000 5data['Injury_Type']data['Injury_Type_String'] = [' '.join(l) for l in data['Injury_Type']]data['Organ']data['Organ_String'] = [' '.join(l) for l in data['Organ']]from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(list(data['Organ_String']))Organ_df = pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names())Organ_dfacl back biceps0 0 1 01 0 0 12 1 0 0Y = vectorizer.fit_transform(list(data['Injury_Type_String']))Injury_Type_df = pd.DataFrame(Y.toarray(),columns=vectorizer.get_feature_names())Injury_Type_dfback torn0 1 01 0 12 0 1data = pd.concat([data,Organ_df],axis=1)data = pd.concat([data,Injury_Type_df],axis=1)del data['Injury_Type']del data['Injury_Type_String']del data['Organ']del data['Organ_String']print(data) PositionGroup Age speed daysmissing acl back biceps back torn0 LW 30.9295 5.239167 20 0 1 0 1 01 CB 26.2600 4.530000 10 0 0 1 0 12 LB 26.1500 4.440000 5 1 0 0 0 1
PositionGroup_df = pd.get_dummies(data['PositionGroup'])data = pd.concat([data,PositionGroup_df],axis=1)del data['PositionGroup']print(data) Age speed daysmissing acl back biceps back torn CB LB LW0 30.9295 5.239167 20 0 1 0 1 0 0 0 11 26.2600 4.530000 10 0 0 1 0 1 1 0 02 26.1500 4.440000 5 1 0 0 0 1 0 1 0y = data.pop('daysmissing')X = datafrom sklearn.ensemble import RandomForestRegressorregr = RandomForestRegressor()regr.fit(X,y)