Creating a dataframe includes my cross validation scores I'm kinda beginner and stuck at some basic part of my work. I want to create a pandas dataframe showing my CV scores and std's per model. I managed to get the results I want but I feel like I did it the wrong way.
from sklearn.model_selection import train_test_split, KFold, cross_val_score
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor, BaggingRegressor
import xgboost as xgb
import lightgbm as lgb

mods = [LinearRegression(),Ridge(),GradientBoostingRegressor(),
  RandomForestRegressor(),BaggingRegressor(),
  xgb.XGBRegressor(), lgb.LGBMRegressor()]
scores = []
stds = []
for mod in mods:
    score = rmsle_cv(mod)
    scores.append(score.mean())
    stds.append(score.std())

This is the part I'm not sure about, It's working but whenever I want to add a new model I need to edit lists twice, I wonder if there is a better way to do this(I don't wanna have another list includes model names:
models = ['LinearRegression','Ridge','GradientBoostingRegressor',
  'RandomForestRegressor','BaggingRegressor', 'XGBRegressor', 'LGBMRegressor']
model_df = pd.DataFrame({
    'Model': models,
    'Score': scores,
    'Std': stds})
print(model_df.sort_values(by='Score', ascending=True).reset_index(drop=True))

 A: You can do type(model) and there is an variable __name__ . Try something like this below, I could not get the score for your models so I used a simple r2
from sklearn.linear_model import LinearRegression, Ridge 
from sklearn.metrics import r2_score
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor, BaggingRegressor 
import xgboost as xgb 
import lightgbm as lgb
import pandas as pd

mods = [LinearRegression(),Ridge(),GradientBoostingRegressor(),
  RandomForestRegressor(),BaggingRegressor(),
  xgb.XGBRegressor(), lgb.LGBMRegressor()]

data = load_iris()
df = pd.DataFrame(data.data, columns=['sepal.length','sepal.width','petal.length','petal.width'])

X = df[['sepal.length','sepal.width']]
y = df['petal.width']

fitted = [mod.fit(X,y) for mod in mods]

model_df = pd.DataFrame({
    'Model': [type(i).__name__ for i in fitted],
    'Score': [i.score(X,y) for i in fitted]
    })

model_df

                       Model     Score
0           LinearRegression  0.742928
1                      Ridge  0.742797
2  GradientBoostingRegressor  0.929430
3      RandomForestRegressor  0.943384
4           BaggingRegressor  0.941296
5               XGBRegressor  0.919452
6              LGBMRegressor  0.861518

A: Most of your models are from sklearn, so I think you might be able to do something like the following. Note very carefully that I have created a list of the functions, not their instantiations. Note that I instantiate the models at the end. Also, I don't seem to have your xgboost module, nor your lightgbm module, so I left those out. You might or might not be able to extract the right info from their __init__ properties.
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.ensemble import GradientBoostingRegressor, \
    RandomForestRegressor, BaggingRegressor

mods = [LinearRegression, Ridge, GradientBoostingRegressor,
        RandomForestRegressor, BaggingRegressor]


def extract_name_from_sklearn_model(model) -> str:
    """
    This function extracts a model's name, and assumes it has a fit
    method.
    """

    prop = '__init__'

    # Get a dict of the model's properties.
    properties = dict(vars(model).items())

    # Assume it has a fit method.
    predict_str = str(properties[prop])

    # Get whatever is after the string '<function ' and before
    # the string '.prop'. That should be the function name.
    func_name = predict_str.split('<function ')[1] \
        .split('.' + prop)[0]

    return func_name


models = [extract_name_from_sklearn_model(model) for model in mods]
print(str(models))

# Finally, you need to instantiate your classes.
mod_classes = [func() for func in mods]

Now you can maintain one list of models, so long as they include a '__init__' method from which you can extract the model's name.
I also think your lists could be more elegant. Maybe something like this:
score = [rmsle_cv(mod) for mod in mod_classes]
scores = [this_score.mean() for this_score in score]
stds = [this_score.std() for this_score in score]

