ஒரு கோப்பினுள் பல்வேறு columns இருக்கிறதெனில், அவற்றுள் எந்தெந்த column மதிப்புகளைப் பொறுத்து நாம் கணிக்கின்ற விஷயம் அமைகிறது எனக் கண்டுபிடிப்பதே feature selection ஆகும். உதாரணத்துக்கு 400, 500 columns-ஐக் கொண்டுள்ள கோப்பிலிருந்து, prediction-க்கு உதவும் ஒருசில முக்கிய columns-ஐத் தேர்வு செய்வது feature selection ஆகும். இதற்கு முதலில் நம்மிடமுள்ள columns-ஐ process variables, manipulated variables & disturbance variables எனும் 3 வகையின் கீழ் பிரிக்க வேண்டும். இதில் manipulated மற்றும் disturbance இரண்டும் input-க்கான parameter-ஆகவும், process என்பது output-க்கான parameter-ஆகவும் அமைகிறது.
- Manipulated Variables (MV) – இவ்வகையின் கீழ் அமையும் columns-ல் உள்ள மதிப்புகளை நம்மால் மாற்றி அமைக்க முடியும். நமக்கேற்றவாறு இதனை நாம் கையாளலாம்.
- Disturbance Variables (DV) – இதனை நம்மால் நேரடியாக மாற்றி அமைக்க முடியாது. ஆனால் manipulated-ன் மதிப்பினைப் பொறுத்தே இதன் மதிப்பு அமைகிறது.
- Process Variales (PV) – பல்வேறு செயல்முறைகளைப் பொறுத்து இதிலுள்ள மதிப்புகள் அமையும். அதாவது மற்ற columns மதிப்புகளைப் பொறுத்தே இதன் மதிப்பு அமைகிறது. எனவே இதில் நாம் மாற்றுவதற்கு எதும் கிடையாது .
மேற்கண்டவாறு பிரித்த பின் ஒவ்வொரு variable-க்கும் மற்ற variables-வுடன் இருக்கும் தொடர்பினைக் கணக்கிடல் வேண்டும். இதுவே correlation எனப்படும். இதன் மதிப்பு -1 லிருந்து +1 வரை அமையும். -1 என்பது எதிர்மறைத் தொடர்பையும், +1 நேர்மறைத் தொடர்பையும் குறிக்கும்.
உதாரணத்துக்கு “உண்ணும் உணவின் அளவு”, “உடற்பயிற்சி செய்யும் நேரம்”, “எடை குறைப்பு புத்தகங்களைப் படிக்கும் நேரம்” போன்ற சில பல features-ஐ வைத்து, “உடலின் எடை” எனும் ஒரு விஷயத்தை நாம் கணிக்கப் போவதாகக் கொண்டால் அதற்கான correlation matrixல் உள்ள மதிப்புகள் பின்வருமாறு அமையும்.
- Positive Correlation: உடலின் எடைக்கும் – உண்ணும் உணவின் அளவுக்குமான தொடர்பு +1 என வெளிப்படும். உணவின் அளவு அதிகரித்தால் எடை அதிகரிக்கும்.
- Positive Correlation: உடலின் எடைக்கும் – உடற்பயிற்சி செய்யும் நேரத்திற்குமான தொடர்பு -1 என வெளிப்படும். உடற்பயிற்சி செய்யும் நேரம் அதிகரித்தால் உடலின் எடை குறையும்.
- Zero Correlation: எடை குறைப்பு பற்றிய புத்தகங்களைப் படிக்கும் நேரத்துடன் கொண்டுள்ள தொடர்பு 0 என வெளிப்படும். படிக்கும் நேரத்திற்க்கும் உடலின் எடைக்கும் யாதொரு சம்மந்தமும் இல்லை
- இவையல்லாத வேறு சில features இருப்பின் அவை கொண்டுள்ள தொடர்பினைப் பொறுத்து, அதற்கான மதிப்பு -1 லிருந்து 1 வரை அமையும்.
Highly Correlated features (MV – DV) :
கீழ்க்கண்ட உதாரணத்தில், data.csv எனும் கோப்பிற்குள் உள்ள columns-ல் எது எது என்னென்ன வகையான parameters எனும் விவரத்தை நாம் domain expert-ன் உதவி கொண்டு தெரிந்து கொள்ளலாம். உதாரணத்துக்கு A முதல் Z வரை பெயர்கள் கொண்ட 26 features-ல் A,B,C,D,E,F ஆகியவை process parameters ஆகவும், மற்றவை manipulated மற்றும் disturbance parameters ஆகவும் கருதியுள்ளோம். எனவே முதலில் process parameters அனைத்தும் dataframe-லிருந்து நீக்கப்படுகின்றன. பின்னர் மீதியுள்ள manipulated மற்றும் disturbance parameters-க்கான correlation கண்டுபிடிக்கப்பட்டு, அது கோப்பு வடிவிலும், வரைபட வடிவிலும் வெளிப்படுத்தப்பட்டுள்ளது. இவற்றில் அதிக அளவு நேர்மறை மற்றும் எதிர்மறைத் தொடர்பு கொண்டுள்ளவை dataframe-லிருந்து நீக்கப்படுகின்றன. அதாவது -98,-99,-1,98,99,1 எனும் தொடர்பினைப் பெற்றிருக்கும் இரு features-ல் ஒன்று நீக்கப்படுகிறது. இவ்வாறாக manipulated மற்றும் disturbance-க்கிடையில் அதிகத் தொடர்பு கொண்டுள்ள அம்சங்கள் கண்டுபிடிக்கப்பட்டு அவற்றில் ஒன்று நீக்கப்படுகிறது. மீதமுள்ள அனைத்தும் training_data எனும் பெயரில் சேமிக்கப்படுகிறது. இதுவே நமது process variable-க்கும், தேர்ந்தெடுக்கப்பட்ட manipulated & disturbance variable-க்குமான தொடர்பினைக் கண்டறிவதற்கு உள்ளீடாக அமைகிறது. இவைகள் அனைத்தும் நாம் கணிக்க வேண்டிய process variable-வுடன் கொண்டுள்ள தொடர்பினைக் கண்டுபிடித்து, அதில் 0 தொடர்பு பெற்றுள்ள columns-ஐ நீக்குவது அடுத்த படியாக அமைகிறது.
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 | |
import matplotlib.pyplot as plt | |
import numpy | |
from sklearn.linear_model import LinearRegression | |
from sklearn.model_selection import train_test_split,cross_val_score | |
from sklearn.metrics import mean_squared_error | |
from math import sqrt | |
from sklearn.feature_selection import RFE | |
from sklearn.datasets import make_friedman1 | |
df = pd.read_csv('./data.csv') | |
# Dropping all process parameters | |
df = df.drop(["A","B", "C", "D", "E", "F"], axis=1) | |
#finding correlation between manipulated & disturbance variables | |
correlations = df.corr() | |
correlations = correlations.round(2) | |
correlations.to_csv('MV_DV_correlation.csv',index=False) | |
fig = plt.figure() | |
g = fig.add_subplot(111) | |
cax = g.matshow(correlations, vmin=-1, vmax=1) | |
fig.colorbar(cax) | |
ticks = numpy.arange(0,20,1) | |
g.set_xticks(ticks) | |
g.set_yticks(ticks) | |
g.set_xticklabels(list(df.columns)) | |
g.set_yticklabels(list(df.columns)) | |
plt.savefig('MV_DV_correlation.png') | |
#removing parameters with high correlation | |
upper = correlations.where(numpy.triu(numpy.ones(correlations.shape), k=1).astype(numpy.bool)) | |
cols_to_drop = [] | |
for i in upper.columns: | |
if (any(upper[i] == -1) or any(upper[i] == -0.98) or any(upper[i] == -0.99) or any(upper[i] == 0.98) or any(upper[i] == 0.99) or any(upper[i] == 1)): | |
cols_to_drop.append(i) | |
df = df.drop(cols_to_drop, axis=1) | |
print (df.shape,df.columns) | |
df.to_csv('./training_data.csv',index=False) |
நிரலுக்கான வெளியீடு:
(20, 17) Index([‘G’, ‘H’, ‘J’, ‘K’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’], dtype=’object’)
Zero Correlated features (PV – MV,DV) :
“A” என்பது நாம் கணிக்க வேண்டிய process parameter எனக் கொள்வோம். training_data எனும் கோப்பிற்குள், இந்த “A” -வை கடைசி column-ஆக இணைத்து கீழ்க்கண்ட நிரலுக்கு உள்ளீடாக அனுப்பவும். பின்னர் A-க்கும் மற்ற parameters-க்குமான தொடர்பினைக் கண்டுபிடித்து, அதில் 0 தொடர்பு கொண்டுள்ள MV, DV -யை நிக்கிவிடவும். இங்கு 0.6 -க்கும் குறைவான அதாவது 0.1, 0.2, 0.3, 0.4, 0.5 எனும் மதிப்புகளைப் பெற்றுள்ள columns நீக்கப்படுகின்றன.
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 | |
import matplotlib.pyplot as plt | |
import numpy | |
from sklearn.linear_model import LinearRegression | |
from sklearn.model_selection import train_test_split,cross_val_score | |
from sklearn.metrics import mean_squared_error | |
from math import sqrt | |
from sklearn.feature_selection import RFE | |
from sklearn.datasets import make_friedman1 | |
df = pd.read_csv('./training_data.csv') | |
print (df.shape,df.columns) | |
# Dropping columns which has correlation with target less than threshold | |
target = "A" | |
correlations = df.corr()[target].abs() | |
correlations = correlations.round(2) | |
correlations.to_csv('./PV_MVDV_correlation.csv',index=False) | |
df=df.drop(correlations[correlations<0.06].index, axis=1) | |
print (df.shape,df.columns) | |
df.to_csv('./training.csv',index=False) |
நிரலுக்கான வெளியீடு:
(20, 18) Index([‘G’, ‘H’, ‘J’, ‘K’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘A’], dtype=’object’)
(20, 17) Index([‘G’, ‘H’, ‘J’, ‘K’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘A’], dtype=’object’)
Recursive Feature Elimination Technique :
இது RFE technique என்று அழைக்கப்படும். Randomforest, Decisiontree, Adaboost, Extratrees, gradient boosting போன்ற algorithms தானாகவே features-ஐ தேர்வு செய்யும் அளவுக்கு திறன் பெற்று விளங்கும். ஆனால், linear regression, ridge, lasso, elasticnet போன்ற algorithms-க்கு இத்தகைய techniques மூலம் நாம் தான் features-ஐ தேர்வு செய்து வழங்க வேண்டும். இந்த நுட்பமானது ஒரு algorithm-ஐ உள்ளீடாகப் பெற்றுக் கொண்டு, ஒவ்வொரு feature-க்கும் ranking-ஐ வழங்குகிறது.. இதில் rank 1 பெற்றுள்ள feature-ஐ மட்டும் தேர்வு செய்து நாம் பயன்படுத்தலாம்.
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 | |
import matplotlib.pyplot as plt | |
import numpy | |
from sklearn.linear_model import LinearRegression | |
from sklearn.tree import DecisionTreeRegressor | |
from sklearn.model_selection import train_test_split,cross_val_score | |
from sklearn.metrics import mean_squared_error | |
from math import sqrt | |
from sklearn.feature_selection import RFE | |
from sklearn.datasets import make_friedman1 | |
df = pd.read_csv('./training.csv') | |
X = df[list(df.columns)[:-1]] | |
y = df['A'] | |
X_train, X_test, y_train, y_test = train_test_split(X, y) | |
regressor = DecisionTreeRegressor(min_samples_split=3,max_depth=None) | |
regressor.fit(X_train, y_train) | |
y_predictions = regressor.predict(X_test) | |
print ("Selected Features for DecisionTree",regressor.feature_importances_) | |
# RFE Technique – Recursive Feature Elimination | |
X, y = make_friedman1(n_samples=20, n_features=17, random_state=0) | |
selector = RFE(LinearRegression()) | |
selector = selector.fit(X, y) | |
print ("Selected Features for LinearRegression",selector.ranking_) |
இங்கு feature_importances_ எனும் method, decisiontree-ன் மீது செயல்பட்டு, அனைத்து features-க்குமான ranking-ஐ வெளிப்படுத்தியுள்ளதைக் காணலாம். ஆனால் இந்த method, linear regression மீது செயல்படாது. எனவே RFE மூலம் நாம்தான் ranking-ஐ வெளிப்படுத்துமாறு செய்ய வேண்டும். பின்னர் இதிலிருந்து Rank 1 வெளிப்பட்டுள்ள features-ஐ மட்டும் தேர்வு செய்து பயன்படுத்தலாம்.
நிரலுக்கான வெளியீடு:
Selected Features for DecisionTree [9.52359304e-04 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 6.15147906e-03 2.23327627e-03 7.70622020e-02
0.00000000e+00 0.00000000e+00 1.10263284e-03 2.33946020e-04
0.00000000e+00 0.00000000e+00 9.12264104e-01 0.00000000e+00]
Selected Features for LinearRegression [ 1 1 10 1 1 9 8 3 5 2 6 7 1
1 1 4 1]