you can use a dense layer network in keras to predict the symptom.  dense layers are very good at large feature sets for classifying.

Steps
1. build an dataframe where each feature is a column with a 0 or 1 value and a numeric value for the symptom


      lst=[]
      for i in range(1,18):
          lst.append(i)
      for i in lst:
         df['Symptom_'+str(i)]=df['Symptom_'+str(i)].apply(lambda x: str(x).strip()) 
    
        symptoms=set(df['Symptom'])
        features=set(pd.concat([df['Feature_'+str(i)] for i in lst],axis=0))
        symptoms.discard(np.NaN)
        #print(diseases)
        encoder = LabelEncoder()
        df['Target']=encoder.fit_transform(df['Symptom'])
        y=pd.get_dummies(df['Target'])
        y_original=df['Target']
        df.drop('Target',inplace=True,axis=1)
    
        df2=pd.DataFrame(columns=features)
        #convert features to float
        for x in features:
            df2[x]=df2[x].astype(float)
        #print(df2)
        for key,item in df.iterrows():
            #print(key)
            dict={}
            for x in features:
                dict[x]=0
            df2=df2.append(dict,ignore_index=True)
            index=len(df2)
            for i in lst:
                column='Feature_'+str(i)
                value=str(item[column])
                if value != None:
                    df2.loc[index-1,value]=1
        X=df2            
        
        print(X)

    model=Sequential()
    model.add(layers.Input(shape=(len(features),), name='main_input'))
    model.add(Dense(300, activation='tanh')) 
    model.add(Dense(100, activation='tanh')) 
    model.add(Dense(64, activation='tanh')) 
    model.add(Dense(34, activation='tanh')) 
    model.add(Flatten())
    model.add(Dense(len(y.columns),activation='softmax'))
    
    print(len(X),len(y))
    X_train, X_test, y_train, y_test= train_test_split(X,y,test_size=0.3)
    
    print(X_train)
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    
    history=model.fit(X_train,y_train, epochs=150, verbose=0)
    
    plt.plot(history.history['loss'])
    plt.title('loss accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.show()