நாம் உருவாக்கிய model-ன் score-ஆனது மிகவும் குறைவாக இருக்கிறது எனில், அது எந்த இடத்தில் அதிகம் வேறுபடுகிறது எனக் கண்டறிய trend / parity போன்ற வரைபடங்களைப் போட்டுப் பார்க்க வேண்டும். கீழ்க்கண்ட உதாரணத்தில் ஒரு வீட்டின் விலையை நிர்ணயிப்பதற்கான பல்வேறு அம்சங்களும், அதனடிப்படையில் நிர்ணயிக்கப்பட்ட விற்பனை விலைகளும் பயிற்சிக்குக் கொடுக்கப்பட்டுள்ளன. இதை வைத்து நாம் உருவாக்கிய model-ன் score ஆனது 35 என வந்துள்ளது. எனவே எந்த இடத்தில் உண்மையான விலையும், கணிக்கப்படும் விலையும் அதிகம் வேறுபடுகிறது எனக் கண்டறிய trend, parity plots வரையப்பட்டுள்ளன.
நிரல் மற்றும் அதன் வெளியீடு:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
from sklearn.linear_model import LinearRegression | |
from sklearn.model_selection import train_test_split,cross_val_score | |
from sklearn.externals import joblib | |
from sklearn.metrics import mean_squared_error | |
import matplotlib.pyplot as plt | |
from math import sqrt | |
import os | |
df = pd.read_csv('./training_data.csv') | |
X = df[list(df.columns)[:-1]] | |
y = df['SalePrice'] | |
X_train, X_test, y_train, y_test = train_test_split(X, y) | |
regressor = LinearRegression() | |
regressor.fit(X_train, y_train) | |
y_predictions = regressor.predict(X_test) | |
meanSquaredError=mean_squared_error(y_test, y_predictions) | |
rootMeanSquaredError = sqrt(meanSquaredError) | |
print("Number of predictions:",len(y_predictions)) | |
print("Mean Squared Error:", meanSquaredError) | |
print("Root Mean Squared Error:", rootMeanSquaredError) | |
print ("Scoring:",regressor.score(X_test, y_test)) | |
## TREND PLOT | |
y_test25 = y_test[:35] | |
y_predictions25 = y_predictions[:35] | |
myrange = [i for i in range(1,36)] | |
fig = plt.figure() | |
ax = fig.add_subplot(111) | |
ax.grid() | |
plt.plot(myrange,y_test25, marker='o') | |
plt.plot(myrange,y_predictions25, marker='o') | |
plt.title('Trend between Actual and Predicted – 35 samples') | |
ax.set_xlabel("No. of Data Points") | |
ax.set_ylabel("Values- SalePrice") | |
plt.legend(['Actual points','Predicted values']) | |
plt.savefig('TrendActualvsPredicted.png',dpi=100) | |
plt.show() | |
## PARITY PLOT | |
y_testp = y_test[:]+50000 | |
y_testm = y_test[:]-50000 | |
fig = plt.figure() | |
ax = fig.add_subplot(111) | |
ax.grid() | |
plt.plot(y_test,y_predictions,'r.') | |
plt.plot(y_test,y_test,'k-',color = 'green') | |
plt.plot(y_test,y_testp,color = 'blue') | |
plt.plot(y_test,y_testm,color = 'blue') | |
plt.title('Parity Plot') | |
ax.set_xlabel("Actual Values") | |
ax.set_ylabel("Predicted Values") | |
plt.legend(['Actual vs Predicted points','Actual value line','Threshold of 50000']) | |
plt.show() | |
## Data Distribution | |
fig = plt.figure() | |
plt.plot([i for i in range(1,1461)],y,'r.') | |
plt.title('Data Distribution') | |
plt.show() | |
a, b = 0 , 0 | |
for i in range(0,1460): | |
if(y[i]>250000): | |
a += 1 | |
else: | |
b +=1 | |
print(a, b) | |
#X = X[:600] | |
#y = y[:600] |
Trend plot என்பது உண்மையான விலைகளும் model-கணித்த விலைகளும் எந்த அளவுக்கு வித்தியாசப்படுகின்றன என்பதைக் காட்டுகிறது.
Parity plot என்பது அந்த வித்தியாசத்திற்கு ஒரு threshold-ஐ அமைக்கிறது. அதாவது விலை வேறுபாடானது 50ஆயிரம் வரை முன்னும் பின்னும் செல்லலாம் எனக் கொடுத்து அந்த threshold-க்குள் எவ்வளவு விலைகள் அமைந்துள்ளன, அதற்கு மேல் எவ்வளவு அமைந்துள்ளது என்பதைக் காட்டுகிறது.
அடுத்தபடியாக data distribution chart வரையப்பட்டுள்ளது. இதன் X-அச்சில் பயிற்சிக்கு அளிக்கப்பட்டுள்ள 1460 rows-ம், Y-அச்சில் விற்பனை விலைகளும் வரைபடமாக வரைந்து காட்டப்பட்டுள்ளன. இதில் முதல் 600 records-வரை விற்பனை விலைகள் 1 லட்சத்திலிருந்து 5 லட்சம் வரை பரவலாகப் பரவியுள்ளத்தைக் காணலாம். அதற்கு மேல் 600-லிருந்து 1000 records-வரை விற்பனை விலைகள் அனைத்தும் வெறும் 2 லட்சத்திலேயே அதிகம் அமைந்திருப்பதைக் காணலாம். இதுவே model-ன் குறைந்த அளவு score-க்குக் காரணம். பயிற்சி அளிக்கப்படும் தரவுகளானது சீரான முறையில் பரவலாக அமைந்திருக்க வேண்டும் என ஏற்கனவே கண்டோம். இங்கு அவ்வாறு இல்லை. எனவே எதுவரை சீராகப் பரவியுள்ளதோ அதுவரை மட்டும் உள்ள தரவுகளைக் கொடுத்து model-ஐ உருவாக்கும்போது அதன் score அதிகரிப்பதைக் காணலாம். X = df[list(df.columns)[:-1]] , y = df[‘SalePrice’] எனக் கொடுத்த பின்னர், X = X[:600] , y = y[:600] எனும் வரிகளை இணைத்தால் போதுமானது. முதல் 600 records வரை மட்டும் உள்ள தரவுகளை எடுத்து நமது model உருவாக்கப்படும்.
Output:
Number of predictions: 365
Mean Squared Error: 2312162517.277571
Root Mean Squared Error: 48084.95104788578
Scoring: 0.34729555622354125
97 1363
கடைசியாக பயிற்சிக்குக் கொடுக்கப்பட்டுள்ள 1460 தரவுகளில் 250000-க்கும் மேல் எவ்வளவு மதிப்புகள் உள்ளன, அதற்குக் கீழ் எவ்வளவு மதிப்புகள் உள்ளன என்பது கண்டுபிடிக்கப்பட்டுள்ளது. இதில் 1363 மதிப்புகள் 250000-க்கு கீழும், வெறும் 97 மதிப்புகள் அதற்கு மேலும் அமைந்துள்ளன. எனவே இதுவும் சீராக இல்லை. இதுவே outliers எனப்படுகிறது. இதுபோன்ற outliers-ஐ எவ்வாறு கண்டுபிடித்து நீக்குவது என அடுத்த பகுதியில் காணலாம்.