import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
np.random.seed(0)
n_samples = 100
X = np.random.rand(n_samples, 3)
y = 3 * X[:, 0] + 2 * X[:, 1] + 5 * X[:, 2] + np.random.randn(n_samples)
data = pd.DataFrame({'Feature1': X[:, 0], 'Feature2': X[:, 1], 'Feature3': X[:, 2], 'Price': y})
X = data[['Feature1', 'Feature2', 'Feature3']]
y = data['Price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error (MSE): {mse}")
print(f"R-squared (R2) Score: {r2}")
plt.scatter(y_test, y_pred)
plt.xlabel("Actual Prices")
plt.ylabel("Predicted Prices")
plt.title("Actual Prices vs. Predicted Prices")
plt.show()
coefficients = pd.DataFrame({'Feature': X.columns, 'Coefficient': model.coef_})
print(coefficients)
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdApmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCB0cmFpbl90ZXN0X3NwbGl0CmZyb20gc2tsZWFybi5saW5lYXJfbW9kZWwgaW1wb3J0IExpbmVhclJlZ3Jlc3Npb24KZnJvbSBza2xlYXJuLm1ldHJpY3MgaW1wb3J0IG1lYW5fc3F1YXJlZF9lcnJvciwgcjJfc2NvcmUKCm5wLnJhbmRvbS5zZWVkKDApCm5fc2FtcGxlcyA9IDEwMApYID0gbnAucmFuZG9tLnJhbmQobl9zYW1wbGVzLCAzKSAKeSA9IDMgKiBYWzosIDBdICsgMiAqIFhbOiwgMV0gKyA1ICogWFs6LCAyXSArIG5wLnJhbmRvbS5yYW5kbihuX3NhbXBsZXMpCmRhdGEgPSBwZC5EYXRhRnJhbWUoeydGZWF0dXJlMSc6IFhbOiwgMF0sICdGZWF0dXJlMic6IFhbOiwgMV0sICdGZWF0dXJlMyc6IFhbOiwgMl0sICdQcmljZSc6IHl9KQoKWCA9IGRhdGFbWydGZWF0dXJlMScsICdGZWF0dXJlMicsICdGZWF0dXJlMyddXQp5ID0gZGF0YVsnUHJpY2UnXQoKWF90cmFpbiwgWF90ZXN0LCB5X3RyYWluLCB5X3Rlc3QgPSB0cmFpbl90ZXN0X3NwbGl0KFgsIHksIHRlc3Rfc2l6ZT0wLjIsIHJhbmRvbV9zdGF0ZT00MikKCm1vZGVsID0gTGluZWFyUmVncmVzc2lvbigpCm1vZGVsLmZpdChYX3RyYWluLCB5X3RyYWluKQoKeV9wcmVkID0gbW9kZWwucHJlZGljdChYX3Rlc3QpCgptc2UgPSBtZWFuX3NxdWFyZWRfZXJyb3IoeV90ZXN0LCB5X3ByZWQpCgpyMiA9IHIyX3Njb3JlKHlfdGVzdCwgeV9wcmVkKQoKcHJpbnQoZiJNZWFuIFNxdWFyZWQgRXJyb3IgKE1TRSk6IHttc2V9IikKcHJpbnQoZiJSLXNxdWFyZWQgKFIyKSBTY29yZToge3IyfSIpCgpwbHQuc2NhdHRlcih5X3Rlc3QsIHlfcHJlZCkKcGx0LnhsYWJlbCgiQWN0dWFsIFByaWNlcyIpCnBsdC55bGFiZWwoIlByZWRpY3RlZCBQcmljZXMiKQpwbHQudGl0bGUoIkFjdHVhbCBQcmljZXMgdnMuIFByZWRpY3RlZCBQcmljZXMiKQpwbHQuc2hvdygpCgpjb2VmZmljaWVudHMgPSBwZC5EYXRhRnJhbWUoeydGZWF0dXJlJzogWC5jb2x1bW5zLCAnQ29lZmZpY2llbnQnOiBtb2RlbC5jb2VmX30pCnByaW50KGNvZWZmaWNpZW50cykK