input: Write a python function to construct a regression model using the features provided in the House Prices Advanced Regression Techniques dataset. The function should pre-process the data and employ feature engineering to increase the accuracy of the model. Use Scikit-Learn library for the implementation.
  assert isinstance(predict_house_price([[8, 3000, 2, 1]]), float)
  assert predict_house_price([[5, 1500, 1, 1]]) > 0
output: def predict_house_price(features):
      import pandas as pd
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import StandardScaler, OneHotEncoder
      from sklearn.compose import ColumnTransformer
      from sklearn.pipeline import Pipeline
      from sklearn.impute import SimpleImputer
      from sklearn.ensemble import RandomForestRegressor
      from sklearn.metrics import mean_squared_error
  
      # Load the dataset (assuming it is available as a CSV file)
      data = pd.read_csv('house_prices.csv')
  
      # Define target variable and features
      X = data.drop(columns=['SalePrice'])
      y = data['SalePrice']
  
      # Define numerical and categorical features
      numerical_features = X.select_dtypes(include=['int64', 'float64']).columns
      categorical_features = X.select_dtypes(include=['object']).columns
  
      # Preprocessing for numerical data
      numerical_transformer = Pipeline(steps=[
          ('imputer', SimpleImputer(strategy='median')),
          ('scaler', StandardScaler())
      ])
  
      # Preprocessing for categorical data
      categorical_transformer = Pipeline(steps=[
          ('imputer', SimpleImputer(strategy='most_frequent')),
          ('onehot', OneHotEncoder(handle_unknown='ignore'))
      ])
  
      # Combine preprocessing steps
      preprocessor = ColumnTransformer(
          transformers=[
              ('num', numerical_transformer, numerical_features),
              ('cat', categorical_transformer, categorical_features)
          ])
  
      # Define the model
      model = Pipeline(steps=[
          ('preprocessor', preprocessor),
          ('regressor', RandomForestRegressor(n_estimators=100, random_state=0))
      ])
  
      # Split the data into training and testing sets
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
  
      # Fit the model
      model.fit(X_train, y_train)
  
      # Predict on the test set and evaluate
      y_pred = model.predict(X_test)
      mse = mean_squared_error(y_test, y_pred)
      print(f'Mean Squared Error: {mse}')
  
      # Predict on the given features
      prediction = model.predict(features)
      
      return float(prediction[0])