How to handle features with very broad range
I suggest to try a log transformation. This has two potential benefits:


The range of x values becomes smaller
Your transformed data might be closer to resemble a normal distribution (only relevant for some models, e.g. not for trees)


Here are two toy examples to illustrate:

Toy example 1

s = np.random.lognormal(3, 1, 1000)
plt.hist(s, 100)
plt.show()




plt.hist(np.log(s), 100)
plt.show()




As you can see from the second plot the range of x values has become smaller and the transformed distribution resembles a normal distribution. Of course this is a highly artificial example since the non-transformed distribution is log_normal. 

Toy example 2

s = np.random.geometric(0.2,100000)
plt.hist(s, 100)
plt.show()




plt.hist(np.log(s), 100)
plt.show()




This one does not look as nice (i.e. normally distributed) anymore as example 1 but still your range of x values has become more compact. 

In case your data includes x values of $0$ you can use np.log(x+1). If your data included negative values it would become trickier (approaches for this case include signed log as described here or simply adding a constant value, like the minimum, to your data).